我今天开始学习cocoa绑定,并成功地使用了一个例外。也就是说,当我在启动时填充绑定数组时,在我从UI添加新条目之前,tableview不会反映此数据,此时它将显示数组中的其余数据。
我是否需要添加一些代码来刷新' tableview在填充数组后必然会被绑定?
编辑:这是我从awakeFromNib
调用的加载方法:
- (void)load
{
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *savedArray = [currentDefaults objectForKey:@"components"];
if (savedArray != nil)
{
NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray];
if (oldArray != nil) {
_components = [[NSMutableArray alloc] initWithArray:oldArray];
} else {
_components = [[NSMutableArray alloc] init];
}
}
}
其中_components
是NSTableView
答案 0 :(得分:2)
在发布时填充表格的一种方法是从load
方法中调用init
,而不是等到awakeFromNib
。例如:
- (id)init {
if ((self = [super init])) {
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *savedArray = [currentDefaults objectForKey:@"components"];
if (savedArray != nil)
{
NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray];
if (oldArray != nil) {
_components = [[NSMutableArray alloc] initWithArray:oldArray];
} else {
_components = [[NSMutableArray alloc] init];
}
}
}
return self;
}
(请注意,您应将此更改为您正在使用的课程的指定init
方法。
现在发生的事情是,在调用awakeFromNib
之前,正在创建NSArrayController
,并且其初始内容被设置为nil
数组(自_components
起尚未创建)。然后调用awakeFromNib
,你正在创建_components
数组,但是它的方式不符合键值观察者(你直接设置实例变量,这不允许{ {1}}要知道你已经修改了它感兴趣的数组。)
通过在NSArrayController
中先前创建_components
实例变量,可以确保在从nib文件取消归档init
时它可用。然后,它可以将其初始内容设置为该数组,以便在窗口出现时在表视图中有数据。
关于如何以符合KVC / KVO的方式修改NSArrayController
的评论,有几种不同的方式,其中一些方法比其他方式更有效。您可以像这样致电_components
:
mutableArrayValueForKey:
请参阅Troubleshooting Cocoa Bindings: My collection controller isn't displaying the current data。
但更有效的方法是添加和删除 [[self mutableArrayValueForKey:@"components"] addObject:theObject];
本身的项目,而不是添加和删除基础数组。这使得数组控制器知道正在进行更改,并让数组控制器处理修改底层数组的内容。请参阅Programmatically Modifying a Controller’s Contents。
答案 1 :(得分:1)
基本上,表格视图的常见步骤是:
将tableview放在视图控制器中(通过xib或以编程方式) 和视图控制器的参考出口(例如:称之为myTableView)
将委托和数据源绑定到视图控制器(通过xib或以编程方式)
(视图控制器中的代理人是UITableViewDataSource
,UITableViewDelegate
)
保留一个数组(可能作为视图控制器的属性,我们假设将其称为NSMutableArray * mySource
)并填写一些对象
(例如:这可以在viewDidLoad
中完成,如果尚未填充)
实现tableview的委托方法,如:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
定义了tableview中的部分数量(现在你只需返回1)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
(return [self.mySource count]
)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
出列/创建要呈现在myTableView中的单元格
加载完UI视图后,请调用表格视图[self.myTableView reloadData]
的方法(注意:我建议您至少在-(void)viewDidAppear:(BOOL)animated
中调用它,以确保它真的是真的执行,或在视图中按下按钮后。)
然后,每次您要添加项目并且想要在tableview中显示更新的datsource时,只需再次致电[self.myTableView reloadData]
。
希望它有所帮助!
答案 2 :(得分:1)
在启动时如何填充绑定数组?你使用NSArray还是NSMutableArray?我不知道你的问题是什么,但是绑定的可能原因没有更新:
[self.mutableArrayProperty addObject:@"Value"]
不会更新绑定到mutableArrayProperty的绑定。绑定依赖于键值观察,当某个值设置为绑定属性时,它们会更新,而不是在绑定属性对象返回其状态时更新。