7

Tôi đang gặp một lớp học sinh:làm thế nào để có được NSPopUpButton đối tượng được chọn?

@interface student : NSObject{  
    NSString *name; 
    NSDate *date; 
} 

và tôi có một NSMutableArray cho danh sách các sinh viên, và tôi bị ràng buộc nó vào một NSPopUpButton như nội dung

này: studentArray, arrangedObjects giá trị nội dung: studentArray , arrangedObjects, tên

bây giờ tôi có thể nhận được các đối tượng sinh viên như thế này:

-(IBAction)studentPopupItemSelected:(id)sender 
{ 
    NSPopUpButton *btn = (NSPopUpButton*)sender; 

    int index = [btn indexOfSelectedItem]; 
    student *std = [studentArray objectAtIndex:index]; 

    NSLog(@"%@ => %@", [std name], [std date]); 
} 

có cách nào để tôi có thể lấy đối tượng sinh viên trực tiếp từ NSPopUpButton ???? như:

NSPopUpButton *btn = (NSPopUpButton*)sender; 
student *std = (student *)[btn objectValueOfSelectedItem]; 
+0

ngoài sự tò mò, điều gì đang kích hoạt 'IBAction' được liệt kê? –

Trả lời

7

Cách bạn đang làm là tốt. Có một cách khác, nhưng không nhất thiết phải tốt hơn.

Về cơ bản, nút bật lên có chứa menu và trong menu có các mục menu.

Trên mục menu có thuộc tính được gọi là representObject, bạn có thể sử dụng nó để tạo liên kết với sinh viên.

Vì vậy, bạn có thể tạo nút bật lên theo cách thủ công bằng cách tạo các mục menu và thêm chúng vào menu của bạn.

3

Tôi tin rằng cách bạn đang làm là tốt nhất. Kể từ khi NSPopUpButton đang được phổ biến bởi mảng của bạn, nó không thực sự chứa đối tượng, nó chỉ biết nó ở đâu. Cá nhân tôi sẽ sử dụng

-(IBAction)studentPopupItemSelected:(id)sender { 
    student *std = [studentArray objectAtIndex:[sender indexOfSelectedItem]]; 
    NSLog(@"%@ => %@", [std name], [std date]); 
} 

Sau khi xem tài liệu trên NSPopUpButton Tôi chắc chắn đây là cách hiệu quả nhất để có được đối tượng.

3

Tôi giải quyết vấn đề bằng cách sử dụng "NSMenuDidSendActionNotification" được gửi khi người dùng đã chọn NSMenuItem approriate trong NSMenu của NSPopUpButton.

Bạn có thể đăng ký người quan sát, ví dụ: "awakeFromNib" như thế này

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(popUpSelectionChanged:) 
              name:NSMenuDidSendActionNotification 
              object:[[self myPopUpButton] menu]]; 

Nếu bạn có một vài NSPopUpButton bạn có thể đăng ký người quan sát cho mỗi người. Đừng quên để loại bỏ các quan sát viên (s) trong dealloc:

[[NSNotificationCenter defaultCenter] removeObserver: self]; 

Trong popUpSelectionChanged bạn có thể kiểm tra tiêu đề để bạn biết mà đơn thực sự được gửi thông báo. Bạn có thể đặt tiêu đề trong Trình tạo giao diện trong Thanh tra thuộc tính.

- (void)popUpSelectionChanged:(NSNotification *)notification {  
    NSDictionary *info = [notification userInfo]; 
    if ([[[[info objectForKey:@"MenuItem"] menu] title] isEqualToString:@"<title of menu of myPopUpButton>"]) { 
     // do useful things ... 
    } 
}