我正在从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
我控制将组合框拖动到app delegate(这是我的简单默认应用程序中唯一的类)并连接了委托和数据源,但这些事件都没有触发。我认为app委托是正确的,但由于它没有触发,我也尝试了“文件所有者”和“应用程序”。我不认为那些会起作用而他们没有。
在Cocoa应用程序中为NSComboBox
连接委托/数据源的正确方法是什么?
谢谢!
答案 0 :(得分:15)
如果您已在spcAppDelegate.m
文件中实际实现了这些方法,则可能需要仔细检查是否在界面中的nib文件中检查了Uses Data Source
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有点帮助,但是当我第一次学习时,我发现如果有一个同伴指南链接到一个班级,那么这些更有助于理解如何在实践中使用该班级。如果您在 Companion指南中查看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
答案 1 :(得分:0)
昨天我遇到了类似的情况,直到我记得将文件所有者数据源连接到IB中的IBOutlet: