2012-01-05 18 views
6

Tôi có một NSMenuItem với một loạt các mục trong đó, tuy nhiên ... danh sách chỉ không được bật.NSMenuItem bật các mục

Những gì tôi có nghĩa là:
List

Đây là mã của tôi:

- (void)didFetchNewList:(NSArray *)list 
{ 
    NSArray *smallList = [list subarrayWithRange:NSMakeRange(0, 10)]; 

    NSMenu *menu = [[NSMenu alloc] initWithTitle:@""]; 

    for (NSDictionary *dict in smallList) 
    { 
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setDateFormat:@"MMM dd @ HH:mm:ss"]; 

     NSMenuItem *soMenuItem = [[NSMenuItem alloc] initWithTitle: 
        [dateFormatter stringFromDate:[dict objectForKey:@"date"]] 
                  action:nil 
                keyEquivalent:@""]; 
     [soMenuItem setEnabled:YES]; 

     [menu addItem:soMenuItem];   
    } 

    [menu addItem:[NSMenuItem separatorItem]]; 

    NSMenuItem *soMenuItem = [[NSMenuItem alloc] 
        initWithTitle:@"Settings" action:nil keyEquivalent:@"S"]; 
    [soMenuItem setEnabled:YES]; 
    [menu addItem:soMenuItem]; 

    [statusItem setMenu:menu]; 
    [statusItem setEnabled:YES]; 

} 

Tôi đang thiết lập mọi thứ đã được kích hoạt, nhưng nó vẫn bị vô hiệu hóa. Làm sao tôi có thể giải quyết việc này?

Trả lời

12

Khi bạn tạo NSMenuItem, mặt hàng của bạn sẽ phải có mục tiêu hợp lệ và bộ chọn hợp lệ. Điều này có nghĩa là mục tiêu không thể là nil và phải trả lời bộ chọn được truyền. Hãy nhớ rằng trong trường hợp này một bộ chọn NULL sẽ không kích hoạt mục menu.

NSMenu *myMenu; 
NSMenuItem *myItem; 

myMenu = [[NSMenu alloc] initWithTitle:@""]; 
myItem = [[NSMenuItem alloc] initWithTitle:@"Test" action:@selector(validSelector:) keyEquivalent:@""]; 
[myItem setTarget:myTarget]; 
[myMenu addItem:myItem]; 
// Do anything you like 
[myMenu release]; 
[myItem release]; 

EDIT: tôi thấy bạn đang gọi điện thoại -[NSMenuItem setEnabled:] với YES sau khi bạn tạo các mục trình đơn. Điều này là không cần thiết, vì chúng sẽ được kích hoạt theo mặc định.

CHỈNH SỬA 2: Vì NSGod đã chỉ ra (xem nhận xét bên dưới), mục tiêu có thể là không. Trong trường hợp đó, người trả lời đầu tiên của ứng dụng của bạn sẽ nhận được phương thức được thông qua. Đó là, miễn là người trả lời đầu tiên đã thực hiện phương pháp đó. (chỉnh sửa 3) Tuy nhiên, nếu không phải như vậy, phương thức sẽ được gửi tới người trả lời tiếp theo trong chuỗi phản hồi. Điều này tiếp tục cho đến khi một trong hai đáp ứng được tìm thấy rằng phản ứng với bộ chọn hoặc không có đáp ứng còn lại để kiểm tra. Khi không tìm thấy phần trả lời, mục menu của bạn sẽ không được bật.

+4

Trong khi các mục menu cần có bộ chọn hợp lệ, chúng không nhất thiết phải có mục tiêu (nói cách khác, mục tiêu ** có thể ** là 'nil'). Mục tiêu 'nil' có nghĩa là" sử dụng đối tượng đầu tiên trong chuỗi phản hồi trả lời cho bộ chọn của tôi ". Nó có chức năng tương đương với việc thiết lập mục tiêu của mục menu thành đối tượng proxy 'First Responder' trong tệp nib. (Xem http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html#//apple_ref/doc/uid/20000261-74653-BAJBGJHB) – NSGod

+0

Aha! Tôi đã suy nghĩ về lý do tại sao địa ngục phương thức khởi tạo không có đối số đích. Cám ơn giải thích rõ ràng! – v1Axvw

+3

Chỉnh sửa thứ hai của bạn vẫn không hoàn toàn chính xác: Người trả lời đầu tiên sẽ nhận được thông báo hành động, nhưng không cần thực hiện nó. Nếu không, nó sẽ chuyển tiếp tin nhắn tới phần trả lời tiếp theo của nó. Đó là chuỗi trả lời tại nơi làm việc. –

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