Objective c Cocoa编程,设置委托
我正从iOS转向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
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