拆分视图应用程序与多个细节视图

时间:2014-08-09 20:39:12

标签: uisplitviewcontroller master-detail detailview

我正在尝试使用多个详细视图控制器创建拆分视图应用。我在应用程序的基本设置/骨架上遇到了麻烦。首先,我尝试使用xcode的Master-Detail Application模板。问题是模板中的类看起来像这样:

MasterViewController.h
MasterViewController.m
DetailViewController.h
DetailViewController.m

但我想要的是这样的:

MasterViewController.h
MasterViewController.m
TitleViewController.h
TitleViewController.m
DateViewController.h
DateViewController.m
...

我无法弄清楚当用户选择新行时如何让我的视图控制器加载。

我也试过使用Apple的示例MultipleDetailViews应用程序,但示例应用程序对我来说有很多问题,包括它使用nib文件,这是我不想要的。

有人可以帮忙吗?是否有一些关于如何设置具有多个详细视图控制器(没有笔尖)的拆分视图应用程序的教程?谢谢!

*响应:

谢谢!你可以发布BigNerdRanch的链接吗?我无法找到它。此外,我无法关注Raywenderlich,因为它使用旧版本的xcode。在你的示例项目之后,我想我已经接近了,但是我得到了一个终止于未被捕获的例子......"。这就是我的所作所为:

从Master-Detail模板创建新项目。 添加文件MyTableViewController.h和MyTableViewController.m。 在MasterViewController.m中,将节数设置为1,将行数设置为2。 在MasterViewController.h中添加属性" MyTableViewController * myTableViewController"。 (当用户点击第一行时,detailViewController应显示,当他点击第二行时,myTableViewController应显示。) 在MasterViewController.m中,将didSelectRowAtIndexPath更改为:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    int row = [indexPath row];

    if( row == 0 ) {
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.detailViewController];
        NSArray *vcs = [NSArray arrayWithObjects:[self navigationController],nav, nil];
        [[self splitViewController] setViewControllers:vcs];
    }
    else {
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.myTableViewController];
        NSArray *vcs = [NSArray arrayWithObjects:[self navigationController],nav, nil];
        [[self splitViewController] setViewControllers:vcs];
    }
}

项目运行,但是当我点击第二行(行== 1)时,我得到了异常。

*更新2

- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {
    int row = [indexPath row];

    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

    UINavigationController *detailNav = [delegate.splitController.viewControllers objectAtIndex: 1];
    NSArray *viewControllers = nil;
    switch (row) {
        case 0:
            viewControllers = [[NSArray alloc] initWithObjects: delegate.dateController, nil];
            break;
        case 1:
            viewControllers = [[NSArray alloc] initWithObjects: delegate.repeatController, nil];
        default:
            break;
    }

    [delegate.splitController removeFromParentViewController];
    detailNav.viewControllers = viewControllers;
    [delegate.window addSubview: delegate.splitController.view];
}

2 个答案:

答案 0 :(得分:0)

BigNerdRanch实际上有一个关于如何使用UISplitViewControllers的精彩教程。老实说,使用它们将不同的UIViewController推送到Detail或Master viewController之间没有区别。他们只需要彼此引用,当事件发生时,将新的viewController推送到一侧或另一侧。我在下面附上了一个示例项目供您参考。

示例项目:link

这是另一个通过Raywenderlich设置一个的教程:link

答案 1 :(得分:0)

因此,在UITableViewController(即MasterViewController)内部发生以下情况。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            // 1. get the controllers from the split view [master, detail]
            let controllers = split.viewControllers
            
            // 2. get nav controller for the detail  + the current storyboard
            let navigationController = controllers[controllers.count-1] as!
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            
            // 3. create the appropriate view controller (vc) then just replace the navigation controllers root vc with your new one using 'navigationController.setViewControllers([vc] ...'
            switch indexPath.row {
            case 1:
                let vc = storyboard.instantiateViewController(withIdentifier: "DetailTableViewController") as! DetailTableViewController
                navigationController.setViewControllers([vc], animated: false)
            case 2:
                let vc = storyboard.instantiateViewController(withIdentifier: "DetailCollectionViewController") as! DetailCollectionViewController
                navigationController.setViewControllers([vc], animated: false)
            default:
                let vc = storyboard.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
                navigationController.setViewControllers([vc], animated: false)
                break
            }
        }

您可以使用segue做同样的事情。从情节提要中的MasterViewController中,将segue拖到导航控制器,并将segue类型设置为“ Show Detail(例如,replace)”。然后从那里didSelectRowAt中,您可以调用具有标识符的performSegue。确保您的Segue具有“标识符”

看看这个video