Objective c 无nib/xib编程的UISplitViewController
我通常创建没有IB内容的项目。我要做的第一件事是去掉对xib、plist等的所有引用。没问题,很好用(在我的世界里) 现在,我刚刚安装了3.2,并尝试开发我的第一个iPad应用程序。按照与前面相同的步骤,我创建了一个基于UISplitView的应用程序项目,并剥离了所有IB内容。此外,我还遵循了苹果参考文档中的部分:,但尽管如此,主视图从未显示,只有细节视图显示(无论方向如何)。我真的试着仔细看了一遍,但我不明白我错过了什么Objective c 无nib/xib编程的UISplitViewController,objective-c,ipad,uisplitviewcontroller,Objective C,Ipad,Uisplitviewcontroller,我通常创建没有IB内容的项目。我要做的第一件事是去掉对xib、plist等的所有引用。没问题,很好用(在我的世界里) 现在,我刚刚安装了3.2,并尝试开发我的第一个iPad应用程序。按照与前面相同的步骤,我创建了一个基于UISplitView的应用程序项目,并剥离了所有IB内容。此外,我还遵循了苹果参考文档中的部分:,但尽管如此,主视图从未显示,只有细节视图显示(无论方向如何)。我真的试着仔细看了一遍,但我不明白我错过了什么 是否有一个UISplitViewController的工作示例,它的笔
是否有一个UISplitViewController的工作示例,它的笔尖不在某个地方浮动?我在谷歌上搜索过,但没有找到。或者你知道我可能遗漏了什么吗?在代理标题中声明splitviewcontroller,在DidFinishController中使用类似的内容 确保将UISPlitViewController删除门添加到detailedViewController头文件,并且还具有委托方法。记住导入相关的头文件
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
splitViewController = [[UISplitViewController alloc] init];
rootViewController *root = [[rootViewController alloc] init];
detailedViewController *detail = [[detailedViewController alloc] init];
UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:root];
UINavigationController *detailNav = [[UINavigationController alloc] initWithRootViewController:detail];
splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, detailNav, nil];
splitViewController.delegate = detail;
[window addSubview:splitViewController.view];
编辑-根据下面Scott的建议,不要添加到windows子视图中
[self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket
[window makeKeyAndVisible];
return YES;
}
//detailedView delegate methods
- (void)splitViewController:(UISplitViewController*)svc
willHideViewController:(UIViewController *)aViewController
withBarButtonItem:(UIBarButtonItem*)barButtonItem
forPopoverController:(UIPopoverController*)pc
{
[barButtonItem setTitle:@"your title"];
self.navigationItem.leftBarButtonItem = barButtonItem;
}
- (void)splitViewController:(UISplitViewController*)svc
willShowViewController:(UIViewController *)aViewController
invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
self.navigationItem.leftBarButtonItem = nil;
}
与IB相比,我更喜欢代码;-) 老掉牙的线程,但当上述技术无法生成正确响应设备方向更改事件的UISplitViewController时,我想我会为读者节省时间和悲伤。您需要:
[window addSubview:splitViewController.view]; // don't do this
而是将主窗口的根控制器设置为UISplitViewController:
[self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket
将splitviewcontroller的视图添加为主窗口的子视图(勉强)允许它与同级视图同时显示,但它不符合UISplitViewController的预期用例。UISplitViewController是highlander视图;只能有一个。我刚刚遇到了同样的问题。 确保splitview的子viewController可以自动旋转到界面方向 您可以按如下方式更改childViewController中的函数:
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
然后将显示主视图。Swift 5.2 iOS 13 主视图和局部视图控制器都嵌入在导航控制器中
let splitViewController = UISplitViewController()
splitViewController.delegate = self
let masterVC = MasterViewController()
let detailVC = DetailViewController()
let masterNavController = UINavigationController(rootViewController: masterVC)
let detailNavController = UINavigationController(rootViewController: detailVC)
splitViewController.viewControllers = [masterNavController,detailNavController]
您可以将此代码放在AppDelegate中(如果您的目标是iOS 13.0+)didFinishLaunchingWithOptions
函数中,也可以放在SceneDelegate中。请记住将splitViewController
设置为您的rootViewController
self.window!.rootViewController = splitViewController
这个答案正是我一直在寻找的。一个问题:在Apple的参考示例代码()中,它们在根视图控制器中处理UiSplitviewcontroller委托。您可以在详细控制器中处理它。有这样或那样的原因吗?成为代理的控制器取决于您。如果您觉得
detailViewController
将命令rootViewController
,这是完全正确的:)。虽然在这种情况下,您可能希望将变量重命名为适合您的设计的名称(例如listViewController
和mainViewController
分别用于rootViewController
和detailedViewController
),但“我通常创建项目时没有IB内容。”在iOS 13中,您应该将此代码放在ScenedeLegate中。我应该早点修复它。谢谢我在“self.window!.rootViewController=splitViewController”中收到此错误消息:“线程1:致命错误:在展开可选值时意外发现nil”,因为窗口为nil。“我能做什么?”马库斯给窗户定了一个尺寸