我尝试在推送导航返回后更新自定义单元格中某个标签的分数。
在我的父UITableViewController
中,我有代码:
在 ViewDidLoad
中//These are mutable strings
self.disciplineScoreString1 = [NSMutableString stringWithFormat:@""];
self.disciplineScoreString2 = [NSMutableString stringWithFormat:@""];
self.disciplineScoreString3 = [NSMutableString stringWithFormat:@""];
self.disciplineScoreArray = [[NSMutableArray alloc] init];
[self.disciplineScoreArray addObject:self.disciplineScoreString1];
[self.disciplineScoreArray addObject:self.disciplineScoreString2];
[self.disciplineScoreArray addObject:self.disciplineScoreString3];
到目前为止一切顺利。
在 cellForRowAtIndexPath
中//this is the custom subclass of UITableViewCell
DayTableViewCell *cell = (DayTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
//this is the custom label
cell.disciplineScoreLabel.text = [self.disciplineScoreArray objectAtIndex:indexPath.row];
return cell;
还是那么好。现在,每个3个单元格中的标签都是空白的。
我现在从第一个单元格转到UIViewController
,然后从child UIViewController
返回成功设置{NS}所在的self.disciplineScoreString1
到@"10"
的字符串值parent UITableViewController
。
如何更新第一个单元格的标签?我在reload data
中尝试了ViewWillAppear
,但它无效。
三江源
修改
这是Child ViewController
在 viewWillDisappear:
中[super viewWillDisappear:animated];
[self calculateDisciplineScore];
NSInteger currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];
DisciplineTableViewController *parent = (DisciplineTableViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex];
parent.disciplineScoreString1 = self.disciplineScoreText;
答案 0 :(得分:1)
您必须更改字符串,而不是修改它...考虑此示例
NSMutableArray *array = [NSMutableArray array];
NSMutableString *disciplineScoreString1 = [NSMutableString stringWithFormat:@"original string"];
[array addObject:disciplineScoreString1];
[disciplineScoreString1 appendString:@" hello"]; // OK.. you're modifying the original string
NSLog(@"%@", [array objectAtIndex:0]);
disciplineScoreString1 = [NSMutableString stringWithFormat:@"new string"]; // WRONG!!
NSLog(@"%@", [array objectAtIndex:0]);
输出是:
2014-02-15 06:36:46.693 Hello[19493:903] original string hello
2014-02-15 06:36:46.694 Hello[19493:903] original string hello
第二个例子是错误的,因为你正在创建一个新字符串,并且数组中的对象仍然指向旧的原始字符串。
编辑:
// try this
[parent.disciplineScoreString1 replaceCharactersInRange:NSMakeRange(0, parent.disciplineScoreString1.length) withString:self.disciplineScoreText];
// instead of
parent.disciplineScoreString1 = self.disciplineScoreText;
答案 1 :(得分:0)
您当前的方法非常严格且不太标准。您通常会设置某种委托来将数据从子级传递给父级。孩子应该知道如何进入父母的内脏并更改其数据,这是非常正确的。
我个人会从这样的事情开始
@interface ChildViewController : UIViewController
@property (nonatomic, copy) void (^onCompletion)(ChildViewController *viewController, NSString *disciplineText);
@end
现在我假设你只是从孩子内部打电话给[self.navigationController popViewControllerAnimated:YES]
而解雇?这有点奇怪,因为它意味着现在只能在navigationController中呈现childViewController,这使得它不太可重复使用。
我要做的就是你通常打电话给popViewControllerAnimated:
我会称之为完成
if (self.onCompletion) {
self.onCompletion(self, self.disciplineText);
}
现在,提供onCompletion
的对象可以决定如何删除此控制器,并告知我们完成的数据,这使控制器能够按照自己的意愿行事。
在您的情况下,父控制器将提供完成,因为它知道如何呈现孩子,因此它将知道如何解雇它。它还知道它可能想要对孩子用
完成的数据做些什么// Where you present the child
childViewController.disciplineText = self.self.disciplineScoreArray[index];
__weak __typeof(self) weakSelf = self;
childViewController.onCompletion = ^(ChildViewController *viewController, NSString *disciplineText){
weakSelf.disciplineScoreArray replaceObjectAtIndex:index withObject:disciplineText];
[self.navigationController popViewControllerAnimated:YES];
[weakSelf.tableView reloadRowsAtIndexPaths:@[ [NSIndexPath indexPathForRow:index inSection:0] ]
withRowAnimation:UITableViewRowAnimationFade];
};