可可编程,设置代表

时间:2012-02-25 02:29:00

标签: objective-c xcode cocoa interface-builder

我正在从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连接委托/数据源的正确方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:15)

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

enter image description here

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

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

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

答案 1 :(得分:0)

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

enter image description here