截屏: 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)
}
实际出现了最终日志,因此肯定会调用该方法。我打了折扣以下内容:
self.dayOutlet.text
未通过项目中的任何其他方法写入其他地方CustomCell
答案 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!";
一般来说,很少需要双向委托结构。保持一定的方式,从A
到B
,并且只需记住A
在self
发送给B
的任何邮件中B
。这样,A
就会知道邮件来自的对象,并能够与{{1}}进行通信。
感谢Paulw11