我正在尝试使用多个详细视图控制器创建拆分视图应用。我在应用程序的基本设置/骨架上遇到了麻烦。首先,我尝试使用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];
}
答案 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