绑定的tableview未在启动时填充

时间:2014-04-10 08:23:50

标签: objective-c nstableview cocoa-bindings

我今天开始学习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];
        }
    }
}

其中_componentsNSTableView

的绑定来源

3 个答案:

答案 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或以编程方式)
    (视图控制器中的代理人是UITableViewDataSourceUITableViewDelegate

  • 保留一个数组(可能作为视图控制器的属性,我们假设将其称为NSMutableArray * mySource)并填写一些对象 (例如:这可以在viewDidLoad中完成,如果尚未填充)

  • 实现tableview的委托方法,如:

    • - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView定义了tableview中的部分数量(现在你只需返回1)

    • 应该返回数据源数组的
    • - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionreturn [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还是NSM​​utableArray?我不知道你的问题是什么,但是绑定的可能原因没有更新:

  • 直接设置实例变量,而不是通过属性设置;
  • 修改NSMutableArray状态。例如,[self.mutableArrayProperty addObject:@"Value"]不会更新绑定到mutableArrayProperty的绑定。

绑定依赖于键值观察,当某个值设置为绑定属性时,它们会更新,而不是在绑定属性对象返回其状态时更新。