我正在从iOS迁移到Cocoa,并试图弄乱我的前几个程序。我认为在我的表单中添加一个 NSComboBox 会很简单,那部分是。我在我的界面中添加了 <NSComboBoxDelegate, NSComboBoxDataSource>、两个数据回调和通知程序:

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

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

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

@end

我控制将组合框拖动到应用程序委托(delegate)(这是我的简单默认应用程序中唯一的类)并连接委托(delegate)和数据源,但没有触发这些事件。我认为应用程序委托(delegate)是正确的,但由于它没有触发,我还尝试了“文件所有者”和“应用程序”。我认为这些不会奏效,而他们却没有。

在 Cocoa 应用程序中为 NSComboBox 连接委托(delegate)/数据源的正确方法是什么?

谢谢!

最佳答案

如果您已经在 spcAppDelegate.m 文件中实际实现了这些方法,您可能需要仔细检查 Uses Data Source 是否在 Interface Builder 的 nib 文件中检查了 NSComboBox:

请注意,在我创建的快速测试项目中,它没有默认设置。在没有设置该复选框的情况下运行应该在您启动应用程序时将以下内容记录到控制台:

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

虽然 NSComboBox Class Reference 有点帮助,但当我第一次学习时,我发现如果有链接到类(class)的同伴指南,那些对于理解应该如何在实践中使用类(class)更有帮助。如果您查看 配套指南 NSComboBox 类引用的顶部,您会看到 Combo Box Programming Topics

要设置使用数据源的组合框,您可以使用以下内容:

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

示例项目: http://github.com/NSGod/NSComboBox

10-08 07:43