0

我在 nib 文件中创建了一个 tableview 单元格并向其添加了一个按钮,并为名为 actionButton 的按钮创建了一个插座。现在,根据某些条件,我希望隐藏或取消隐藏按钮。我使用了下面的代码,所以当模型,object.hasButton 属性为 YES 时,我取消隐藏按钮并显示其他。这段代码对我来说看起来很简单,我认为不应该存在重用问题,因为它具有非此即彼条件,所以它应该隐藏假布尔值并取消隐藏真布尔条件。但是,所有单元格,无论它们的值是什么,都会显示按钮。有人可以帮我吗,我一直在尝试调试这个,但我似乎没有找出问题所在。

- (UITableViewCell*)tableView:(UITableView *)tableView
        cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  MyObject * object = [[self.tableData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
  MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CELL_IDENTIFIER forIndexPath:indexPath];

  cell.delegate = self;
  if (cell == nil){
    cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CELL_IDENTIFIER];
    cell.delegate = self;

  }


  cell.tableItem = object;
  UIButton *button = cell.actionButton;

  if(object.hasButton){
    [button setHidden:NO];
  }else{
    [button setHidden:YES];

  }

  return cell;

}

似乎问题出在线程上。我在 managedObjectContext performBlock:andWait 方法中进行了一些操作,如下所示,

 [newChildContext performBlockAndWait:^{
  count = [newChildContext countForFetchRequest:req error:NULL];
      if(count > 0)
        hasButton = YES;
      else
        hasButton = NO;
  }];

然后像这样更新模型,

    myObject.hasButton = hasButton;

可能这就是问题所在,所以我将它包装在 @synchronized(myObject) 块中以更新 hasButton 布尔值,现在似乎没问题。

  @synchronzied(myObject){
      myButton.hasButton = hasButton;
    }

莫非是这个东西?

4

2 回答 2

0

调用 if (object.hasButton) 只是检查属性 hasButton 是否存在。它可能确实存在,所以它返回 YES!

您想要的是检查存储在该属性中的值,如下所示:

if (object.hasButton == YES)
于 2013-11-10T17:39:27.173 回答
0

如果你MyObject是一个子类,NSManagedObject那么它的hasButton属性类型是NSNumber *而不是BOOL. 因为这NSNumber是一个现有的对象 - 非零 - 无论它的值是YESNO myObject.hasButton计算为TRUE布尔表达式。改为使用[myObject.hasButton booleanValue]。还设置该值 use anObject.hasButton = @(hasButton)

于 2013-11-10T18:02:34.550 回答