2010-11-12 7 views
1

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

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

Итак, в моей текущей версии я использую следующий код, чтобы установить свойства для произвольных значений (упрощено, чтобы попытаться заставить привязки работать вообще). Затем значение свойства сбрасывается таймером через 10 секунд. Хотя свойство корректно обновляется (проверено журналом консоли), панель предварительного просмотра не отражает изменения в представлении таблицы. К сожалению, я не могу опубликовать скриншоты привязок. У меня есть объект в IB для класса syncFrontEndPref. Тогда у меня есть контроллер массива, связанный с этим объектом w/путь ключа модели в спискеArrayArray. Затем мой столбец таблицы привязан к упорядоченным объектам массива. Это правильно загружается с помощью «test», «test1», «test2» в области pref (как заполнено из метода 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

Как насчет кода? – Eimantas

+0

В частности, как определяются ваши аксессоры изменяемого массива? –

ответ

0

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

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

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


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

alt text

+0

Ты был прав. Два из тех же самых объектов были в моем xib. Теперь привязки отлично работают. Большое спасибо. – ambientdiscourse

Смежные вопросы