我正在尝试制作一个显示我的应用程序冠军的模态视图。 在模态视图中有一个名为champ的NSMutableString变量, 应该由主视图中的returnChamp函数更新。 冠军字符串在主视图中正确设置, 但在模态视图中,冠军值显示为(null)。 事实上,它似乎甚至没有进入returnChamp函数。 所以我的调用或实现returnChamp显然有问题, 但是我有另外一个功能相似,功能正常。
有人可以帮助我吗?
-(void) mainView{
.....
champ = [[currentPlayers objectAtIndex:playerIndex] retain];
NSLog(@"%@",champ);
modalWinner = [[winner alloc] init];
modalWinner.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:modalWinner animated:YES];
}
- (NSMutableString *) returnChamp{
NSLog(@"returnChamp");
return champ;
}
//in modalWinner
-(void) modalView{
..............
champName = [[NSMutableString alloc] init];
NSLog(@"%@", [(MainViewController *)self.parentViewController returnChamp]);
champName = [(MainViewController *)self.parentViewController returnChamp];
UIImage *champImage = [UIImage imageNamed:champName];
}
答案 0 :(得分:1)
self.parentViewController
实际上可能不是对您对象的引用。出于某种原因,似乎框架始终坚持将UINavigationController
设置为self.parentViewController
- 即使对于模态,如果还没有模态,它将创建一个。{这可能会被忽视,因为您将其转换为MainViewController
类型。
您需要找到一种不同的方式使原始对象可以与之通信,或者在呈现之前将适当的值传递给新实例化的控制器。
例如,如果向模态类添加champName
属性,则可以执行以下操作:
modalWinner = [[ModalWinnerViewController alloc] init];
modalWinner.champName = myValue; /* Set value before presenting controller */
[self presentModalViewController:modalWinner animated:YES];
使用此值更新UI可能需要一些代码。模态视图控制器的viewWillAppear
方法是一个很好的地方,因为在呈现视图之前框架会调用它。
请注意,此基于属性的方法也可用于保留对预期父对象的引用。 see here用于解决类似问题的不同方法。