UISplitView - 如果某个实例已经可见,如何阻止加载详细视图的新实例?

时间:2014-02-07 01:38:35

标签: ios objective-c ipad cocoa-touch uisplitviewcontroller

我目前有一个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实例。(有点像设置应用程序的工作方式)

2 个答案:

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