委托调用后IBOutlet UILabel不会更新

时间:2014-08-30 01:40:09

标签: ios uilabel iboutlet

截屏: https://www.youtube.com/watch?v=ZwehDwITEyI

这真是奇怪。问题在于标签插座位于定制设计的表格单元格中。那个单元格是我的CustomCell类。 (如果您观看截屏视频,实际上称为RA_FormCell。)

CustomCell.h

@property (weak, nonatomic) IBOutlet UILabel *dayOutlet;
-(void)controller:(id<CustomCellDelegate>)controller didUpdateDay:(NSString *)theDay;

CustomCell.m

// Method is called by a view controller
// (which is itself a delegate of the CustomCell class,
// hence the identifier you see below)

-(void)controller:(id<CustomCellDelegate>)controller didUpdateDay:(NSString *)theDay;
{
    NSLog(@"Method called") // confirms to me that method is called
    self.dayOutlet.text = @"Goodmorning";
    NSLog(@"%@", self.dayOutlet.text); // displays (null)
}

实际出现了最终日志,因此肯定会调用该方法。我打了折扣以下内容:

  1. self.dayOutlet.text未通过项目中的任何其他方法写入其他地方
  2. dayOutlet已连接到情节提要中的标签(并且标签未与其他任何内容相关联)
  3. 标签未隐藏在故事板上的某些意外静态标签下面
  4. 故事板上的单元格属性包括其类CustomCell
  5. Xcode中没有警告或警告(我一直小心避免任何循环导入)

1 个答案:

答案 0 :(得分:0)

问题是controller:didUpdateDay:消息未发送到正确的单元类实例。

这是因为我没有正确地将此单元格指定为视图控制器的委托。对于任何有兴趣的人,在3:50的截屏视频中,您可以看到cellForRowAtIndexPath中有以下内容:

RA_FormCell *cell = [tableView dequeueReusableCellWithIdentifier:self.formCellArray[indexPath.row] forIndexPath:indexPath];
self.delegate = cell

但是,这意味着在生成表格单元格时,self.delegate会不断被覆盖。结果,我的controller:didUpdateDay消息被发送到表格的底部单元格,而不是我所要求的顶部单元格。

解决方案很简单 - 根本不需要第二个代表。相反,当单元格委托给视图控制器时,它应该将self传递给它委派的消息:

id<CustomCellDelegate> strongDelegate = self.delegate;

if ([strongDelegate respondsToSelector:@selector(customCell:didChangeDay1:)])
    [strongDelegate customCell:self didChangeDay1:[sender value]];

然后,在委托实施此方法时,只需直接更改出口即可结束:

-(void)customCell:(RA_FormCell *)customCell didChangeDay1:(double)value
    // put logic here
    customCell.dayOutlet.text = @"No problem!";

一般来说,很少需要双向委托结构。保持一定的方式,从AB,并且只需记住Aself发送给B的任何邮件中B。这样,A就会知道邮件来自的对象,并能够与{{1}}进行通信。

感谢Paulw11