从 MasterView 触发 DetailView 中的弹出窗口

Posted

技术标签:

【中文标题】从 MasterView 触发 DetailView 中的弹出窗口【英文标题】:Trigger popover in DetailView from MasterView 【发布时间】:2016-05-16 10:58:19 【问题描述】:

我是 ios 编程新手(使用 Swift 学习),最近对 Master Detail Applications 感兴趣,因为我正在学习的书的当前章节也是关于它的。

我注意到我的书似乎有点太旧了,因为 Xcode 的 Master Detail Apps 模板引入了一个拆分视图控制器,而书中的模板仍然只使用一个导航控制器作为初始视图控制器:

(来自 Xcode 的模板) (书中模板)

我想做的是在主视图控制器的工具栏中放置一个“+”按钮,然后触发详细视图控制器内另一个视图控制器的全屏弹出窗口。查看联系人应用程序作为参考,如果您在 iPad 或 iPhone Plus 上横向运行它,就会发生这种情况:

(来自联系人应用程序的示例)

在本书的示例中,工具栏上只是添加了“+”,并从它添加了一个 segue 到新的 View Controller,但使用 Xcode 的新模板并不容易。如何在详细视图中制作这样的弹出框,但由主视图中的按钮启动?

谢谢

【问题讨论】:

【参考方案1】:

从默认的 MD 模板开始:

MasterViewControllerviewDidLoad 中删除addButton 代码。

在情节提要中为母版创建一个添加按钮,并将其链接到 MasterViewController 操作。

从您的细节控制器创建一个转场到您要用作叠加层的那个,并为其命名。

在细节控制器中创建一个方法来执行该segue。

例如:

func displayOverlay() 
    print("perform a segue here to the required controller")
    self.performSegueWithIdentifier("overlay", sender: self)

在master action中,调用detail方法触发segue。

例如:

@IBAction func detailAdd(sender: AnyObject) 
    if let dvc : DetailViewController = detailViewController 
        dvc.displayOverlay()
     else 
        print("Oops...no detail controller")
    

如果您想要显示的动画样式,您将不得不做额外的工作,但这应该可以让您获得基本的控制器连接。

【讨论】:

谢谢!我如何准确地从主视图控制器调用该方法?我知道你必须参考细节视图控制器,但我真的不明白如何 主控制器有那个引用(称为detailViewController )。请参阅更新后的答案以了解操作方法的外观。 我想我找到了一个更好的方法:如果您改为创建从 UISplitView 到新视图的 segue,并使用 self.splitViewController?.performSegueWithIdentifier(id, sender: sender) 在主视图内触发它,视图会根据需要呈现,具体取决于无论您是处于纵向还是横向模式,就像默认的showDetail segue 一样。您的方法仅适用于横向模式,但无论如何感谢您引导我走向正确的方向!

以上是关于从 MasterView 触发 DetailView 中的弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UISplitViewController iOS7.1 上添加 MasterView 的 rightBarButtonItem 隐藏 MasterView 的动作

在 UISplitViewController 中隐藏 MasterView

UISplitView - 为 masterView 中的每一行加载不同的 detailView

获取 UISplitViewController 的 masterview 控制器的显示隐藏事件

在Splitviewcontroller中从左到右改变Masterview的位置

将视图控制器从根推送到详细视图控制器 (SplitView)