iOS Master-Detail,如何在iPad中使用不同的detailViewControllers

时间:2014-11-04 20:17:56

标签: ipad uitableview uistoryboard uisplitviewcontroller uistoryboardsegue

我有一个Master-Detail iOS应用程序,它是使用带有故事板的标准XCode模板构建的。我需要在大多数项目上显示带有浏览器的视图,并在用户点击"设置"时显示设置表单(使用FXForms)。在Master的UITableView中的项目。

我在iPhone上找到了一种方法,但无法在iPad中找到它。在iPhone故事板中,我创建了另一个视图控制器,并从Master到新视图控制器建立另一个segue连接。然后我在didSelectRowAtIndexPath

中执行以下操作
if(indexPath.section == 0 && indexPath.row == 2) // settings
    [self performSegueWithIdentifier:@"showSettings" sender:self];
else
    [self performSegueWithIdentifier:@"showDetail" sender:self];

单击“设置”时,“设置”视图就会出现。来回导航也有效。

然而,在iPad中,detailViewController似乎总是存在于SplitViewController的右侧。如何修改故事板和/或代码以将默认视图交换到“设置”然后再次交换回来?

我还发现XCode的默认模板会创建"关系"用于iPad故事板的segues,一种在iPhone故事板中不存在的类型,并且不能命名为" showSettings"或" showDetail"就像我在iPhone案例中所做的那样。

1 个答案:

答案 0 :(得分:0)

从评论到原帖,我发现:

  1. 如果我定位iOS 8,我可以为iPhone和iPad使用相同的故事板,然后我可以使用“替换”segues(现在称为“show detail”segues)切换到另一个详细视图。非常方便,但iOS 7还没有。

  2. 对于iOS 7,我可以使用segues来支持iPhone,对于iPad,我必须做类似这样的事情(FXForms,如果我使用整齐的库来显示带有选项的视图)。

    < / LI>

    所以我的iPad代码(在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath中为特定行)。我会备份self.splitViewController.viewControllers的当前lastObject以恢复Master中表视图的其他行。

    FXFormViewController *controller = [[FXFormViewController alloc] init];
    IBSettingsForm *settingsForm = [[IBSettingsForm alloc] init];
    settingsForm.fontSize = 12;
    controller.formController.form = settingsForm;
    
    // this is created so that my new view would have a navigation bar    
    UINavigationController *navigationController  = [[UINavigationController alloc] init];
    [navigationController pushViewController:controller animated:false];
    
    self.splitViewController.viewControllers = [NSArray arrayWithObjects:[self.splitViewController.viewControllers objectAtIndex:0],
        navigationController, nil];