Программирование Какао, настройка делегата - PullRequest
7 голосов
/ 25 февраля 2012

Я перехожу с 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

Я управлял перетаскиванием комбинированного списка в делегат приложения (который является единственным классом в моем простом приложении по умолчанию) и подключилсяделегат и источник данных, но ни одно из этих событий не срабатывает.Я думал, что делегат приложения был правильным, но так как он не сработал, я также попробовал «владельца файла» и «приложение».Я не думал, что это сработает, а они нет.

Как правильно подключить делегат / источник данных для NSComboBox в приложении Какао?

Спасибо!

Ответы [ 2 ]

15 голосов
/ 25 февраля 2012

Если вы действительно реализовали эти методы в своем файле spcAppDelegate.m, вы можете перепроверить, что Uses Data Source проверен для NSComboBox в nib-файле в Интерфейсном Разработчике:

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 несколько полезен, когда я впервые изучал, я обнаружил, чтоесли есть сопутствующие руководства, связанные с классом, они были бы гораздо полезнее для понимания того, как следует использовать класс на практике.Если вы посмотрите на верхнюю часть справочника по классу NSComboBox в Справочнике для сопровождающих , вы увидите Темы программирования комбинированного блока .

Чтобы настроить комбоВ поле, в котором используется источник данных, вы можете использовать что-то вроде следующего:

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.

0 голосов
/ 24 марта 2014

Вчера у меня была похожая ситуация, пока я не вспомнил, как подключить источник данных владельца файла к IBOutlet в IB:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...