导航返回后更新UITableViewCell自定义子类的标签?

时间:2014-02-15 11:49:13

标签: ios objective-c uitableview uilabel

我尝试在推送导航返回后更新自定义单元格中某个标签的分数。

在我的父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;

2 个答案:

答案 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];
};