我目前有一个UISplitViewController。我的主视图控制器中有5行,点击时每行都会在屏幕上显示其各自的详细视图。它基本上像某种菜单一样工作。
我编码的方式是在didSelectRow:方法中。
这是一个示例代码
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if([indexPath row] == 0)
{
firstviewcontroller = [self.storyboard instantiateViewControllerWithIdentifier:@"firstviewcontroller"];
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:firstviewcontroller];
NSArray *vcs = [NSArray arrayWithObjects:[self navigationController], nvc, nil];
[[self splitViewController] setViewControllers:vcs];
[[self splitViewController] setDelegate:firstviewcontroller];
对于我拥有的其他4行,它基本相同。
现在,例如,如果点击了第一行,它会显示firstviewcontroller。当再次点击第一行时,它将用新实例替换当前实例。
如何防止这种情况?当我在第一个视图控制器中填写详细信息(例如文本字段等)然后我不小心点击第一行时,它会非常烦人,它会替换当前实例并且所有文本字段都是空的并且需要再次填写。
我也想问一下如何保存viewcontroller实例。例如,我填写了firstviewcontroller中所需的数据,然后点击第二行以显示secondviewcontroller。当我再次点击第一行时,我想拥有我已经完成填充数据的firstviewcontroller实例。(有点像设置应用程序的工作方式)
答案 0 :(得分:2)
您应该做的是将菜单控制器中的内容视图控制器强引用作为属性。
@private (nonatomic, strong) UINavigationController *navController1;
@private (nonatomic, strong) UINavigationController *navController2;
....
然后
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if([indexPath row] == 0)
{
if (!self.navController1) {
UIViewController *firstviewcontroller = [self.storyboard instantiateViewControllerWithIdentifier:@"firstviewcontroller"];
self.navController1 = [[UINavigationController alloc] initWithRootViewController:firstviewcontroller];
}
if ([self splitViewController] viewControllers] lastObject] != self.navController1) {
NSArray *vcs = [NSArray arrayWithObjects:[self navigationController], self.navController1, nil];
[[self splitViewController] setViewControllers:vcs];
[[self splitViewController] setDelegate:self.navController1.rootViewController];
}
}
}
这样,每次都不会重新创建它们,并保留您的状态。
答案 1 :(得分:1)
您可以根据预期在那里的班级检查当前显示的详细视图控制器的类。
if([self.splitViewcontroller.viewControllers.lastObject isKindOfClass:[FirstDetailViewController class]])
{
//Here you know that the current detail view controller is of the kind of the first master row...
[self.splitViewcontroller.viewControllers.lastObject.navigationController popToRootViewControllerAnimated:YES]; //You don't have to do this, just an example.
}
else
{
//Initialize normally
}