自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)?我们将不胜感激。感谢
答案 0 :(得分:20)
On devices which don't support the "split" mode, if
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
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)
}
}