偏好窗格& NSTableView绑定

时间:2010-11-12 02:09:47

标签: cocoa cocoa-bindings

我正在尝试创建一个驻留在系统首选项中的首选项窗格。所有绑定都照常完成(对于正常的窗口应用程序),但是当调用绑定属性的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);   
}

1 个答案:

答案 0 :(得分:0)

我认为你有两个实例化syncFrontEndPref对象的实例。

如果您从模板创建Preference Pane项目,则File的Owner将是NSPreferencePane。如果已为syncFrontEndPref对象添加了另一个条目,则将创建该对象的第二个副本,并且不会在第二个副本中调用mainViewDidLoad。不会为该对象的副本触发计时器,并且不会更新listArray。尝试将日志语句添加到init方法。如果您看到该日志语句运行两次,则您有两个对象副本。

如果您有两个对象副本,我建议删除您添加到IB中xib的副本。将文件所有者的类更改为syncFrontEndPref类,并将绑定连接到该对象。


这看起来像IB中的当前xib文件吗?

alt text