Панель настроек и привязки NSTableView - PullRequest
1 голос
/ 12 ноября 2010

Я пытаюсь создать панель настроек, которая будет находиться в системных настройках. Все привязки выполняются как обычно (для обычного оконного приложения), но когда вызывается установщик свойства привязки (данные обновляются), данные таблицы не сбрасываются. Могут ли панели предпочтений обновлять данные таблиц с помощью привязок? Я также попытался использовать источник данных таблицы безуспешно.

Чтобы уточнить, у меня есть свойство NSMutableArray в основном классе моего prefPane, объект, представляющий основной класс prefPane, и arrayController в IB, который связан со столбцом таблицы. в методе init основного класса prefPane я устанавливаю значение NSMutableArray, которое должным образом отражается на панели pref, однако (просто для проверки работы привязок) у меня есть NSTimer, который сбрасывает значение моего массива NSMutable когда это закончится. В консольном сообщении указывается, что значение сброшено должным образом, однако изменения не отображаются на предварительной панели.

Так что в моей текущей версии я использую следующий код для установки свойств в произвольные значения (упрощено, чтобы попытаться заставить привязки работать вообще). Затем значение свойства сбрасывается таймером через 10 секунд. Несмотря на то, что свойство правильно обновлено (проверено журналом консоли), предварительная панель не отражает изменения в виде таблицы. К сожалению, я не могу публиковать скриншоты привязок. У меня есть объект в IB для класса syncFrontEndPref. Затем у меня есть массив-контроллер, связанный с этим объектом с модельным ключом listArray. Тогда мой столбец таблицы привязан к упорядоченным объектам массива контроллера. Это правильно загружается с «test», «test1», «test2» в предварительной панели (как заполняется из метода init). Однако при повторном заполнении из таймера изменения не отражаются в предварительной панели (хотя консольный журнал подтверждает, что listArray действительно изменился.

Вот код:

@interface syncFrontEndPref : NSPreferencePane 
{

    NSMutableArray *listArray;
    NSNumber *syncInt;
    AuthenticateUser *newUser;
    NSMutableArray *syncIntervalList;
    IBOutlet NSTableView *theTableView;

}

@property (retain) NSMutableArray *listArray;
@property (retain) NSMutableArray *syncIntervalList;

- (void) mainViewDidLoad;
-(IBAction)syncIntervalValueChanged:(id)sender;
-(IBAction)tableViewSelected:(id)sender;



@implementation syncFrontEndPref

@synthesize listArray, syncIntervalList;

-(id) init{

    //populate nsarray w/ list data to display
    //[self setListArray: [NSMutableArray arrayWithArray:[[[NSDictionary dictionaryWithContentsOfFile:[GetFilePath pathForFile]] objectForKey:@"lists"] allObjects]]];
    [self setListArray: [NSMutableArray arrayWithObjects: @"test", @"test1", @"test2", nil]];

    //define values for drop-down sync interval selector
    [self setSyncIntervalList:[NSMutableArray arrayWithObjects: @"1 minute", @"5 minutes", @"10 minutes", @"30 minutes", @"24 hours", nil]];

    return self;

}

//code for the timer and selector method
- (void) mainViewDidLoad{
NSTimer *timer = [[NSTimer new] autorelease];
    int syncTime = 10;
    timer = [NSTimer scheduledTimerWithTimeInterval: syncTime target:self selector:@selector(targetMethod:) userInfo:nil repeats: YES];
}

-(void)targetMethod:(id)sender{

NSLog(@"running timer...");

[self setListArray: [NSMutableArray arrayWithObjects: @"0", @"1", @"2", nil]];
 NSLog(@"%@", listArray);   
}

1 Ответ

0 голосов
/ 13 ноября 2010

Я думаю, у вас есть два экземпляра вашего объекта syncFrontEndPref.

Если вы создадите проект Preference Pane из шаблона, владельцем файла будет NSPreferencePane. Если вы добавили еще одну запись для объекта syncFrontEndPref, вы создадите вторую копию объекта, и mainViewDidLoad не будет вызываться во второй. Таймер не будет запущен для этой копии объекта, а список массивов не будет обновлен. Попробуйте добавить инструкцию log в метод init. Если вы видите, что оператор log выполняется дважды, у вас есть две копии объекта.

Если у вас есть две копии объекта, я бы предложил удалить копию, добавленную вами в xib в IB. Измените класс владельца файла на свой класс syncFrontEndPref и подключите привязки к этому объекту.


Это похоже на ваш текущий xib-файл в IB?

alt text

...