我正在尝试创建一个驻留在系统首选项中的首选项窗格。所有绑定都照常完成(对于正常的窗口应用程序),但是当调用绑定属性的setter(数据更新)时,表数据不会重置。首选项窗格是否能够通过绑定更新表数据?我还试图使用表数据源失败。
为了澄清,我在prefPane的主类中有一个NSMutableArray属性,一个表示prefPane主类的对象,以及一个绑定到表列的IB中的arrayController。在prefPane主类的init方法中,我设置了NSMutableArray的值,它在pref窗格中正确反映,但是,(只是为了测试绑定是否有效),我有一个NSTimer,它重置了我的NSMutable数组的值什么时候结束控制台消息告诉我该值已正确重置,但更改不会反映在pref窗格中。
因此,在我当前的版本中,我使用以下代码将属性设置为任意值(简化为尝试使绑定工作)。然后在10秒后通过计时器重置属性值。虽然属性已正确更新(通过控制台日志验证),但pref窗格不会反映tableview中的更改。不幸的是,我无法发布绑定的屏幕截图。我在IB中有一个syncFrontEndPref类的对象。然后,我有一个数组控制器绑定到此对象w / listArray的模型键路径。然后我的表列绑定到arraycontroller排列的对象。这通过pref窗格中的“test”,“test1”,“test2”正确加载(从init方法填充)。但是,从计时器重新填充时,更改不会反映在pref窗格中(尽管控制台日志确认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);
}
答案 0 :(得分:0)
我认为你有两个实例化syncFrontEndPref对象的实例。
如果您从模板创建Preference Pane项目,则File的Owner将是NSPreferencePane。如果已为syncFrontEndPref对象添加了另一个条目,则将创建该对象的第二个副本,并且不会在第二个副本中调用mainViewDidLoad。不会为该对象的副本触发计时器,并且不会更新listArray。尝试将日志语句添加到init方法。如果您看到该日志语句运行两次,则您有两个对象副本。
如果您有两个对象副本,我建议删除您添加到IB中xib的副本。将文件所有者的类更改为syncFrontEndPref类,并将绑定连接到该对象。
这看起来像IB中的当前xib文件吗?