2012-02-25 31 views
7

Tôi đang chuyển từ iOS sang Cocoa và cố gắng lén lút qua một vài chương trình đầu tiên của mình. Tôi nghĩ sẽ đơn giản hơn khi thêm một số NSComboBox vào mẫu của tôi, phần đó là tốt. Tôi thêm <NSComboBoxDelegate, NSComboBoxDataSource> để giao diện của tôi, hai callbacks dữ liệu, và các notifier:Lập trình Cacao, hãy thiết lập đại biểu

@interface spcAppDelegate : NSObject <NSApplicationDelegate, 
         NSComboBoxDelegate, NSComboBoxDataSource> 

- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index; 
- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox; 

- (void)comboBoxSelectionDidChange:(NSNotification *)notification; 

@end 

để kiểm soát kéo combobox để các đại biểu ứng dụng (đó là lớp duy nhất trong ứng dụng mặc định đơn giản của tôi) và có dây lên các đại biểu và dữ liệu nguồn nhưng không ai trong số những sự kiện đó cháy. Tôi nghĩ rằng đại biểu ứng dụng là chính xác nhưng kể từ khi nó không cháy, tôi cũng đã cố gắng "chủ sở hữu tập tin" và "ứng dụng". Tôi không nghĩ rằng những người sẽ làm việc và họ đã không.

Làm cách nào đúng để kết nối nguồn đại biểu/nguồn dữ liệu cho một số NSComboBox trong ứng dụng Cocoa?

Cảm ơn!

+0

Khi bạn nói "nó không chớp," là những gì bạn làm gì để kiểm tra điều đó? Breakpoint trong trình gỡ rối? NSLog? – user1118321

+0

Bởi "không cháy" Tôi có nghĩa là tôi đã thêm các phương thức đại biểu và thiết lập một điểm ngắt trong chúng mà không đạt được. Bạn có thể nghĩ rằng nó có ý nghĩa rằng hai phương pháp dữ liệu không đạt được nhưng comboBoxSelectionDidChange nên có thể truy cập được. Một lần nữa lỗi của tôi khi tôi đã kết nối sự kiện đó không chính xác. Vì vậy, tôi thực sự đã có hai propblems nhưng sửa chữa chính đã nhận ra rằng có một (mới?) Hộp kiểm để chỉ ra rằng tôi đã sử dụng một nguồn dữ liệu. Cảm ơn :) – simusid

Trả lời

15

Miễn là bạn đã thực sự thực hiện các phương pháp đó trong tập tin spcAppDelegate.m của bạn, bạn có thể muốn kiểm tra lại rằng Uses Data Source được kiểm tra cho NSComboBox trong tập tin nib trong Interface Builder:

enter image description here

Lưu ý rằng nó không được thiết lập theo mặc định trong một dự án thử nghiệm nhanh mà tôi đã tạo. Chạy mà không có bộ hộp nên đăng nhập sau để an ủi khi bạn khởi động ứng dụng:

NSComboBox[2236:403] *** -[NSComboBox setDataSource:] should not be called when 
      usesDataSource is set to NO 
NSComboBox[2236:403] *** -[NSComboBoxCell setDataSource:] should not be called 
      when usesDataSource is set to NO 

Trong khi NSComboBox Class Reference có phần hữu ích, khi tôi còn học đầu tiên, tôi thấy rằng nếu có hướng dẫn đồng hành liên quan đến cho một lớp , chúng hữu ích hơn nhiều trong việc hiểu cách người ta nên sử dụng lớp học trong thực tế. Nếu bạn nhìn vào đầu tài liệu tham khảo lớp học NSComboBox tại Hướng dẫn đi kèm, bạn sẽ thấy Combo Box Programming Topics.

Để thiết lập một combo box có sử dụng một nguồn dữ liệu, bạn có thể sử dụng giống như sau:

spcAppDelegate.h:

#import <Cocoa/Cocoa.h> 

@interface spcAppDelegate : NSObject <NSApplicationDelegate, 
        NSComboBoxDelegate, NSComboBoxDataSource> { 
    IBOutlet NSWindow   *window; 
    IBOutlet NSComboBox   *comboBox; 
    NSMutableArray    *comboBoxItems; 
} 

@property (assign) IBOutlet NSWindow *window; 

@end 

spcAppDelegate.m:

#import "spcAppDelegate.h" 
@implementation spcAppDelegate 
@synthesize window; 
- (id)init { 
    if ((self = [super init])) { 
     comboBoxItems = [[NSMutableArray alloc] initWithArray: 
       [@"Cocoa Programming setting the delegate" 
             componentsSeparatedByString:@" "]]; 
    } 
    return self; 
} 
- (void)dealloc { 
    [comboBoxItems release]; 
    [super dealloc]; 
} 
- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox { 
    return [comboBoxItems count]; 
} 
- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index { 
    if (aComboBox == comboBox) { 
     return [comboBoxItems objectAtIndex:index]; 
    } 
    return nil; 
} 
- (void)comboBoxSelectionDidChange:(NSNotification *)notification { 
    NSLog(@"[%@ %@] value == %@", NSStringFromClass([self class]), 
     NSStringFromSelector(_cmd), [comboBoxItems objectAtIndex: 
     [(NSComboBox *)[notification object] indexOfSelectedItem]]); 

} 
@end 

Dự án mẫu: http://github.com/NSGod/NSComboBox.

+1

Cảm ơn rất nhiều. Đó là "sử dụng nguồn dữ liệu". Tôi đã làm * gần như * mọi thứ đúng :) – simusid

+0

Cảm ơn tất cả các chi tiết! Siêu hữu ích –

+0

Điều này là không thể tin được bực bội mà ngay cả trong OS 10.11 & Xcode 8 nó sẽ không hoạt động nếu bạn không đánh dấu vào ô trong Xib - ngay cả khi bạn đặt 'comboBox.usesDataSource = true' theo chương trình! – Nathaniel

0

Tôi đã có một tình huống tương tự ngày hôm qua cho đến khi tôi nhớ để treo lên các nguồn dữ liệu tập tin Chủ đầu tư đến IBOutlet trong IB:

enter image description here

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