在iPad上使用拆分视图,我有以下代码:
- (void) splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc {
barButtonItem.title = @"Categories";
NSMutableArray *items = [[toolbar items] mutableCopy];
[items insertObject:barButtonItem atIndex:0];
[toolbar setItems:items animated:YES];
[items release];
self.popoverController = pc;
}
Run Code Online (Sandbox Code Playgroud)
这可以很好地显示按下按钮时的弹出窗口.但是,如果按下按钮,我也希望让按钮解除,因为它已经打开以遵循良好的指导方针.我该怎么做呢?(即如果用户反复点击此按钮,则弹出窗口应该会隐藏其他所有击中.)
user-interface ipad uisplitviewcontroller dismiss uipopovercontroller
我正在构建我的第一个iPad应用程序.我的一个要求是处理UISplitviewcontroller和UINavigationController.
我们提出的视图层次结构是
(LoginView) - > UINavigationView(LandingView + CollectionView) - > UISplitViewcontroller(DetailsView).
我们的应用程序仅支持横向模式
我指的是这个SO问题(以及GILT应用程序),作为newbi,我很难根据该描述完成它.
所以我的问题是
1)如果有人可以提供小代码片段或参考教程,我怎么能实现同样的事情
2)根据Apples HIG,UISplitviewcontroller应该是rootviewcontroller,如果不是.Apple会拒绝我的应用程序吗(显然GILT小组已被批准)
3)我找到了MGSplitViewController,我可以使用那个不是root吗?
任何帮助,将不胜感激.作为newbi,我希望我的问题是真实的
我是使用拆分视图创建iPad应用程序的新手.当我第一次使用标准的MasterDetail应用程序模板(Xcode 4.2)创建项目时,它会创建一个MasterViewController和一个DetailViewController.从弹出表(主详细信息视图控制器)中选择行时,模板具有以下方法:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if (!self.detailViewController)
{
self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
}
[self.navigationController pushViewController:self.detailViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)
现在我明白当你使用常规导航控制器时,如果你正在为iPhone编程,你只需要做这种类型的事情就可以将另一个视图控制器推到堆栈上.但是,使用此模板,它只是将详细信息视图推送到弹出窗口而不是更新已存在的内容.我很困惑,因为我需要更新以从弹出窗口中选择一些内容(主详细信息视图),然后进行detailView更新.
更新:
为了尝试测试已在DetailViewController中为您设置的"detailItem",我注释掉了pushViewController并添加了以下内容:
//[self.navigationController pushViewController:self.detailViewController animated:YES];
self.detailViewController.detailItem = @"Test";
// setter in detailViewController
- (void)setDetailItem:(id)newDetailItem
{
if (_detailItem != newDetailItem) {
_detailItem = newDetailItem;
// Update the view.
[self configureView];
}
if (self.masterPopoverController != nil) {
[self.masterPopoverController dismissPopoverAnimated:YES];
}
}
- (void)configureView
{
// Update the user interface for the detail item.
// detailDescriptionLabel.text is a IBOutlet to the label …Run Code Online (Sandbox Code Playgroud) 我已经UISplitViewController在Xcode 6中实现了使用通用故事板.UISplitViewController现在运行iOS 8的iPhone支持,默认情况下,一次只有一个视图控制器在屏幕上.
我需要知道主屏幕控制器和详细视图控制器何时都在屏幕上(iPad).我需要UITableViewCell在屏幕上删除公开指示符- 只有当主视图控制器在屏幕上(iPhone)时才会呈现它们,就像设置应用程序一样.
我可以简单地检测设备,只在iPhone上添加它们,但不建议这样做.新设备可能只显示一个视图控制器而不能识别为电话.另一种认为是检测,如果self.splitViewController是nil,但不会工作,因为它不会nil在iPhone也不iPad的,因为它实际上是在iPhone上的一个拆分视图控制器.
是否可以检测主屏幕控制器和详细视图控制器何时同时在屏幕上可见?
从iOS8开始,我们可以在紧凑型和常规设备上使用UISplitViewController.这很棒,因为我不需要为iPhone和iPad创建两个不同的故事板,但是我遇到了一个问题.
如果拆分视图控制器在iPad上(如果折叠属性为NO),我可以简单地调用它来显示左侧的MasterVC.
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
[self.splitViewController.displayModeButtonItem action];
Run Code Online (Sandbox Code Playgroud)
但如果它在iPhone上(如果折叠属性为YES),则忽略displayMode,并且不执行任何操作.
我无法弹出DetailVC,popToRootViewControllerAnimated因为DetailVC拥有自己的导航控制器.
如果没有像dismissViewControllerAnimated:completion:showDetail 一样的视图控制器的方法,Apple如何期望我们在折叠模式下的代码中显示MasterVC(关闭DetailVC)?我们将不胜感激.谢谢
默认情况下,UISplitViewController提供滑动手势以纵向模式打开主视图.
不幸的是,即使操作详细页面上的滑块,此手势也会打开主控制器!我在这里发现了另一个问题,这个问题被标记为iOS 5.1报告的错误,但问题仍然存在于iOS7上......
现在有办法在这种情况下抑制这种姿势吗?我意识到我可以通过这样做完全删除它:
splitViewController.presentsWithGesture = NO;
Run Code Online (Sandbox Code Playgroud)
然而,允许手势并仍然有可用的滑块将是很好的!
我需要做什么步骤?在Objective-C中,我们创建了一个rootViewController和detailViewController之后添加了这个控制器splitViewController.例如:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
UISplitViewController *splitViewController = [[UISplitViewController alloc] init];
MTTRootViewController *rootViewController = [[MTTRootViewController alloc] init];
MTTDetailedViewController *detailedViewController = [[MTTDetailedViewController alloc]init];
splitViewController.viewControllers = [NSArray arrayWithObjects:rootViewController, detailedViewController, nil];
[self.window setRootViewController:(UIViewController*)splitViewController];
[self.window makeKeyAndVisible];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能在Swift中做同样的事情?
我有UITableViewController(它的名字是新闻)和UIViewController(它的名字是DetailViewController)和UISplitViewController.我希望它在纵向使用iPad时显示后退按钮.我做了按钮,但我不能说出来.我写了以下代码
detailController.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
detailController.navigationItem.leftItemsSupplementBackButton = true
detailController.navigationItem.leftBarButtonItem?.title = navigationController?.topViewController.title
Run Code Online (Sandbox Code Playgroud)
但它没有显示按钮的名称.我只看到箭头(箭头有效).
我也在我的UITableViewController(新闻)中尝试了以下内容,但它没有帮助我

我使用这个代码为不同的设备使用两个segue.
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
var screen = UIScreen.mainScreen().currentMode?.size.height
if (UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad) || screen >= 2000 && UIDevice.currentDevice().orientation.isLandscape == true && (UIDevice.currentDevice().userInterfaceIdiom == .Phone){
performSegueWithIdentifier("showDetailParse", sender: nil)
self.dismissViewControllerAnimated(true, completion: nil)
} else if (UIDevice.currentDevice().userInterfaceIdiom == .Phone) {
performSegueWithIdentifier("showParse", sender: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
我在iPad上的结果

我在iPhone上的结果

我有一个拆分视图控制器,左侧有一个项目列表,右侧有一个详细视图.AppDelegate中的相关代码:
let splitViewController = mainView.instantiateViewControllerWithIdentifier("initial") as! UISplitViewController
let rightNavController = splitViewController.viewControllers.last as! UINavigationController
let detailViewController = rightNavController.topViewController as! DetailsIpad
let leftNavController = splitViewController.viewControllers.first as! UINavigationController
let masterViewController = leftNavController.topViewController as! MainViewController
masterSplitViewController = masterViewController
detailSplitViewController = detailViewController
// Override point for customization after application launch.
let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem()
splitViewController.delegate = self
self.window!.rootViewController = splitViewController
Run Code Online (Sandbox Code Playgroud)
当我第一次启动应用程序时,我发现拆分屏幕的右侧部分占用了所有屏幕:
如果我旋转屏幕,它会被正确设置(可能因为两个视图都出现在屏幕上):
当我在任何地方设置断点时,我看到右侧的详细视图在左侧的主视图(项目列表)之前加载,尽管没有直接调用.我无法更改分屏的视图的调用顺序.我怎样才能解决这个问题?
更新:
我可以在显示拆分视图控制器之前设置它:
splitViewController.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
Run Code Online (Sandbox Code Playgroud)
在我打印时,在分割控制器的ViewDidLoad中:
print(self.preferredDisplayMode.rawValue)
Run Code Online (Sandbox Code Playgroud)
我得到:2,这是AllVisible.但结果仍然相同.
我正在将应用程序过渡到iOS 13,并且UISplitViewController折叠到详细信息视图上,而不是在启动时折叠到主视图上-仅在iPad上。此外,后退按钮也没有显示-好像它是根视图控制器一样。
我的应用程序包含一个UISplitViewController已被子类化的,符合UISplitViewControllerDelegate。拆分视图包含两个子视图-两者都UINavigationControllers嵌入到UITabBarController(子类TabViewController)中
在拆分视图中viewDidLoad,委托设置为self,preferredDisplayMode并且设置为.allVisible。
由于某种原因,splitViewController(_:collapseSecondary:onto:)未调用该方法。
在iOS版12在iPhone和iPad上,该方法splitViewController(_:collapseSecondary:onto:)被正确调用的推出,之间application(didFinishLaunchingWithOptions)和applicationDidBecomeActive。
在iPhone上的iOS 13中,该方法在启动时在和之间正确调用。splitViewController(_:collapseSecondary:onto:)scene(willConnectTo session:)sceneWillEnterForeground
在的iOS 13上的iPad,然而,如果该窗口具有发射例如为分割视图中创建新的场景紧凑的宽度,该splitViewController(_:collapseSecondary:onto:)方法没有在所有调用。仅在将窗口扩展到常规宽度然后收缩时才调用该方法。
class SplitViewController: UISplitViewController, UISplitViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
preferredDisplayMode = .allVisible
}
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto …Run Code Online (Sandbox Code Playgroud)