Objective c Cocoa编程,设置委托

Objective c Cocoa编程,设置委托,objective-c,xcode,cocoa,interface-builder,Objective C,Xcode,Cocoa,Interface Builder,我正从iOS转向Cocoa,并试图通过我最初的几个程序混日子。我想在我的表单中添加一个NSComboBox会很简单,这一部分很简单。我在界面中添加了、两个数据回调和通知程序: @interface spcAppDelegate : NSObject <NSApplicationDelegate, NSComboBoxDelegate, NSComboBoxDataSource> - (id)comboBox:(NSComboBox *)a

我正从iOS转向Cocoa,并试图通过我最初的几个程序混日子。我想在我的表单中添加一个
NSComboBox
会很简单,这一部分很简单。我在界面中添加了
、两个数据回调和通知程序:

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

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

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

@end
@接口SPCAPPDegate:NSObject
-(id)组合框:(NSComboBox*)一个组合框objectValueForItemAtIndex:(NSInteger)索引;
-(NSInteger)组合框中的项目编号:(NSComboBox*)组合框;
-(无效)comboBoxSelectionDidChange:(NSNotification*)通知;
@结束
我控制将组合框拖到应用程序委托(这是我的简单默认应用程序中唯一的类)并连接委托和数据源,但这些事件都不会触发。我认为AppDelegate是正确的,但由于它没有启动,我也尝试了“文件所有者”和“应用程序”。我认为这些都不管用,他们也不管用

在Cocoa应用程序中连接
NSComboBox
的代理/数据源的正确方法是什么


谢谢

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

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

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
类参考的顶部,您将看到配套指南

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

SPH:

#import <Cocoa/Cocoa.h>

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

@property (assign) IBOutlet NSWindow *window;

@end

示例项目:。

昨天我遇到了类似的情况,直到我记得将文件所有者数据源连接到IB中的IBOutlet:


当你说“它没有开火”时,你在做什么来测试它?调试器中的断点?NSLog?我说的“没有触发”是指我添加了委托方法,并在其中设置了一个未到达的断点。您可能认为这两个数据方法没有达到,但是comboBoxSelectionDidChange应该可以达到,这是有道理的。又是我的错,因为我给那个事件的接线错误。所以我实际上有两个问题,但主要的修复方法是意识到有一个(新的?)复选框指示我正在使用数据源。谢谢:)非常感谢。这是“使用数据源”。我几乎把每件事都做对了:)谢谢你提供的所有细节!超级有用这令人难以置信地沮丧,即使在OS 10.11和Xcode 8中,如果不选中Xib中的复选框,它也不会工作——即使您以编程方式设置
comboBox.usesDataSource=true
#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