UISplitViewController - 以折叠模式

时间:2015-05-08 08:55:02

标签: ios objective-c iphone uisplitviewcontroller

自iOS8起,我们就可以在小型和常规设备上使用UISplitViewController。这很棒,因为我不必为iPhone和iPad创建两个不同的故事板,但是我遇到了一个问题。

如果拆分视图控制器在iPad上(如果折叠属性为NO),我可以直接调用它来显示左侧的MasterVC。

self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
[self.splitViewController.displayModeButtonItem action];

但如果它在iPhone上(如果折叠的属性为YES),则忽略displayMode,并且不做任何事情。

我无法使用popToRootViewControllerAnimated弹出DetailVC,因为DetailVC拥有自己的导航控制器。

如果对于与showDetail一起提供的视图控制器没有像dismissViewControllerAnimated:completion:这样的方法,Apple如何期望我们在折叠模式下的代码中显示MasterVC(关闭DetailVC)?我们将不胜感激。感谢

4 个答案:

答案 0 :(得分:20)

On devices which don't support the "split" mode, if

  1. You want to present the master view controller instead of the detail when the public class Library { public IEnumerable<Books> books { get; set; } public string BookName { get; set; } public string Color { get; set; } public int ShelfNumber { get; set; } } first loads, then returning public ActionResult(Library lib) { var b = _bookService.GetBooks(); lib.books = b.Where(x => // select values from table based on the properties that has a value in my model) } in your delegate class (UISplitViewControllerDelegate) UISplitViewController method method should do that:

    YES
  2. You want to dismiss the detail view controller back to the master, after a specific event (e.g. a touch on a button). In this case you have to pop the detail view controller navigation controller:

    splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:

答案 1 :(得分:6)

今天有一个类似的问题试图从拆分视图控制器中的详细视图弹回。

虽然我确定接受的答案可以正常工作,但我发现另一种方法可行,可能更清洁一点就是使用展开的segue。

我在想要返回的主视图上设置了展开segue,然后从我想要弹出的视图中创建了一个到展开segue的segue链接(注意:假设您正在使用故事板)。

确保在弹出的目标视图上设置IBAction:

-(IBAction)prepareForUnwind:(UIStoryboardSegue *)segue { }

将退出连接到故事板中的segue以进行展开segue。抱歉,我没有提供有关如何设置展开segue的详细信息,但有很多可用的教程。

然后在你想要解除的控制器上,将一个segue连接到你弹出的控制器的展开segue。一定要命名segue。

然后在想要关闭的视图控制器中按下按钮,只需调用

[self performSegueWithIdentifier:@"unwindSegueName" sender:self];

这非常有效,可以避免向后挖掘可能会发生变化的导航层次结构。

希望这对某人有用! 节日快乐!

答案 2 :(得分:0)

谢谢 pNre !以下代码将处理折叠时显示自定义后退按钮以及未折叠时显示displayModeButton

lazy var backButtonItem: UIBarButtonItem = {
    UIBarButtonItem(image: UIImage(named: "backImage"), style: .plain, target: self, action: #selector(dismissAnimated))
}()

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    guard let svc = splitViewController else { return }

    if svc.isCollapsed {
        navigationItem.leftBarButtonItem = backButtonItem
    } else {
        navigationItem.leftBarButtonItem = svc.displayModeButtonItem
    }
}

func dismissAnimated() {
    _ = navigationController?.navigationController?.popViewController(animated: true)
}

我已将其放在willLayoutSubviews()而不是viewDidLoad()中,以便按钮自动更新,例如,iPhone 7 Plus上的方向更改和尺寸等级更改(例如分割时)在iPad上查看。

答案 3 :(得分:0)

如果我们处于折叠状态(iPhone不包括+ sizes),那么我最后要做的是弹出DetailVC,如果我们不处于折叠状态(iPad),则显示/隐藏MasterVC。

@IBAction func backTouchUp(_ sender: UIButton) {
    if let splitViewController = splitViewController,
        !splitViewController.isCollapsed {
        UIApplication.shared.sendAction(splitViewController.displayModeButtonItem.action!, to: splitViewController.displayModeButtonItem.target, from: nil, for: nil)
    } else {
        navigationController?.popViewController(animated: true)
    }
}