2011-01-12 19 views
6

Tôi đang cố gắng sử dụng NSProgressIndicator (không xác định) bên trong menu trạng thái. Tôi đang sử dụng một đối tượng NSView làm khung nhìn cho menuitem, và sau đó xem lại chỉ báo tiến trình để hiển thị nó. Nhưng bất cứ khi nào tôi cố gắng gọi startAnimation: cho tiến trình, không có gì xảy ra. Khi tôi cố gắng làm điều tương tự trên một NSWindow bình thường, nó hoạt động hoàn hảo, không phải khi bên trong một menuitem.Sử dụng NSProgressIndicator bên trong NSMenuItem

Tôi là người mới đối với cả ca cao và khách quan-c nên tôi có thể đã bỏ qua điều gì đó "hiển nhiên" nhưng tôi đã tìm kiếm khá một chút để giải quyết nhưng không thành công. Tôi tìm thấy một cái gì đó về menuitems không thể được cập nhật trong khi được hiển thị và rằng bạn cần phải sử dụng một cửa sổ vô giá thay thế. Nhưng tôi đã không thể xác nhận điều này trong bất kỳ tài liệu nào.

Chỉnh sửa:

Ok, gần như hoạt động ngay bây giờ. Khi sử dụng setUsesThreadedAnimation: và từ menu MenuDelegateWillOpen và tạo một chuỗi mới. Chủ đề này chạy một phương pháp cục bộ:

-(void) doWork(NSProgressIndicator*) p{ 
    [p startAnimation:self]; 
} 

Điều này sẽ bắt đầu tiến trình trên cơ sở ngẫu nhiên (?) Khi mở menu. Nếu tôi gọi trực tiếp startAnimation: mà không qua doWork: (vẫn đang sử dụng một chuỗi mới), nó sẽ không bao giờ hoạt động. Không setUsesThreadedAnimation: làm cho thanh tiến trình tạo chuỗi riêng cho hoạt ảnh?

Trả lời

16

Giải quyết nó bằng cách sử dụng:

[progressIndicator performSelector:@selector(startAnimation:) 
          withObject:self 
          afterDelay:0.0 
           inModes:[NSArray 
         arrayWithObject:NSEventTrackingRunLoopMode]]; 

Bên trong menuWillOpen :, vấn đề dường như đã được gọi startAnimation: trước progressbar được hoàn thành bản vẽ riêng của mình.

+0

Cảm ơn bạn rất nhiều vì lời khuyên đó, nó thực sự hữu ích! – Yojik

+0

Điên bao lâu tôi đã tìm kiếm để thực hiện công việc này, cảm ơn rất nhiều! – Jasper

+0

Cảm ơn bạn thân mến Cảm ơn bạn thân mến! –

0

Bạn đã bảo nó sử dụng hoạt ảnh theo luồng qua -setUsesThreadedAnimation :?

+0

Có, dường như không hữu ích. – Henrik

1

Bạn tham chiếu số NSProgressIndicator trong chế độ xem như thế nào (và cái nào trong cửa sổ, cho vấn đề đó)? Ví dụ, bạn có một lớp điều khiển có kết nối với các chỉ số tiến trình của IBOutlet không? Nếu bạn đang sử dụng một số IBOutlet, bạn có chắc chắn nó được nối đúng cách trong tệp nib không?

Ngoài ra, bạn ở đâu và khi nào bạn gọi startAnimation:? (Chúng ta cần xem một số mã).

Một điều đôi khi có thể xảy ra là bạn quên kết nối một số IBOutlet trong ngòi bút. Sau đó, khi bạn cố gắng yêu cầu đối tượng làm điều gì đó trong mã khi chạy, số IBOutletnil và vì vậy, bạn nghĩ là thư được gửi đến đối tượng của bạn thực tế, một thư được gửi đến nil. Nói cách khác, nó chỉ bị bỏ qua, và có vẻ như nó không hoạt động.

Miễn là bạn có một tham chiếu hợp lệ (có khả năng) đối tượng UI, vấn đề chung khác bạn sẽ thấy là khi nhà phát triển đang cố gắng gửi thư đến đối tượng lúc "quá sớm". Nói chung, các phương thức init quá sớm trong thời gian tồn tại của đối tượng bộ điều khiển để có thể gửi tin nhắn tới các đối tượng giao diện người dùng — những số này vẫn là vẫn là nil. Vào thời điểm -awakeFromNib được gọi là, IBOutlet sẽ hợp lệ (miễn là bạn nối chúng vào IB) và sau đó bạn có thể gửi tin nhắn đó đến đối tượng UI.

+0

Điểm tốt, giải thích tại sao tôi đôi khi có giá trị nil khi cố gắng tiếp cận các thành phần đầu ra (gọi chúng quá sớm). Bây giờ tôi dường như thu hẹp nó xuống một vấn đề vẽ.Tôi đã làm cho nó animate khi menuitem chứa view được tô sáng (trong drawRect của view của tôi :), và sau đó làm cho nó dừng lại khi nó không còn được tô sáng nữa. Nhưng nếu tôi cố gắng làm cho nó hoạt hình bên ngoài mệnh đề if-kiểm tra nếu mục được đánh dấu không có gì xảy ra (vẫn còn bên trong drawRect :). – Henrik

+0

Tôi đã quản lý để làm cho nó hoạt động nhiều hơn một chút, có vẻ như tôi đã phải gửi stopAnimation: đôi khi trước khi thực hiện startAnimation: work. Nhưng tôi muốn nó hoạt hình (hoặc không) khi menu được hiển thị. Hiện tại tôi phải di chuột qua chế độ xem để bắt đầu, khi trình đơn được hiển thị, nó chỉ hiển thị thanh tiến trình không hoạt ảnh mặc dù nó sẽ bị ẩn khi không (setDisplayWhenStopped: NO). Để được tiếp tục trong nhận xét tiếp theo ... – Henrik

+0

Và tôi vẫn không thể làm cho nó hoạt động khi gọi nó từ bên ngoài đối tượng xem của tôi, ví dụ: điều hướng thông qua các phần phụ của NSMenu trong lớp điều khiển của nó. Có vẻ như có một số loại sự kiện khi menu đang được hiển thị để hoạt ảnh hoạt động. – Henrik

Các vấn đề liên quan