拆分视图控制器:如何将主视图控制器连接到详细视图控制器?

Posted

技术标签:

【中文标题】拆分视图控制器:如何将主视图控制器连接到详细视图控制器?【英文标题】:Split View Controller: How to connect Master View Controller to Detail View Controller? 【发布时间】:2014-07-17 21:00:46 【问题描述】:

(Xcode6-beta3、Swift、ios8、iPad)

在 iPad 拆分视图控制器中,如何将主视图控制器链接到详细视图控制器?

换句话说,当用户点击左侧的一个项目时,如何更改右侧的视图?

我知道在didSelectRowAtIndexPath中,我需要调用一个方法……但是如何从Master View Controller调用Detail View Controller中的一个方法呢?

示例

想象一个应用程序可以显示不同类型奶酪的信息。我们首先将拆分视图控制器拖到情节提要上。左侧主视图中的项目表设置为如下所示。

瑞士 切达干酪 布里干酪

在右侧,详细视图控制器内部只有一个 Web 视图,名为 cheeseViewController。其中,将显示有关所选奶酪的 html 文档。

一个 IBOutlet 从 Web 视图连接到 cheeseViewController,并在 Detail View Controller 委托中设置了一个名为“changeCheese”的方法来换出文档。

如何点击“Cheddar”更改详细视图中的信息?

编辑:我必须修改我的 AppDelegate.swift 文件吗?使用 Master-Detail 模板,我尝试了以下方法,但没有成功:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool 
    // Override point for customization after application launch.

    let splitViewController = self.window!.rootViewController as UISplitViewController
    let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as UINavigationController
    splitViewController.delegate = navigationController.topViewController as Paragraph

    return true

【问题讨论】:

请解释否决票! 是的,这是一个完全合法的问题。 【参考方案1】:

希望我正确理解了您的问题:您希望在 Detailview 中显示所选奶酪的详细信息。

当您在 XCode 6 Beta 3 中创建新的 Master-Detail-View 应用程序时,您的 DetailViewController.Swift 文件中将有一个名为“detailItem”的变量:

var detailItem: AnyObject? 
    didSet
        self.configureView()
    

您在 MasterViewController.Swift 文件中的以下函数中设置此 detailItem:

override func prepareForSegue(segue: UIStoryBoardSegue, sender: AnyObject?)
   if segue.identifier == "yourSegueIdentifier" 
      let indexPath = self.tableView.indexPathForSelectedRow()
      let cheeese = yourCheeseArrayWithDetailInformation[indexPath.row]
      (segue.destinationViewController as DetailViewController).detailItem = cheeese
   

(假设您已将视图与带有标识符的 segue 链接:“yourSegueIdentifier”和名为“yourCheeseArrayWithDetailInformation”的详细信息数组)

DetailView中的上述函数“configureView”现在可以访问你的detailItem,其中包含“cheeese”的内容

希望对你有帮助。

【讨论】:

我没有创建主从视图应用程序。我创建了一个单视图应用程序,并将一个拆分视图控制器拖到情节提要上 好的......这是一个巨大的帮助。谢谢你。在这里学到了很多教训。首先,从对象托盘中拖动拆分视图控制器时,没有设置任何控制器,也没有您提到的功能。其次,我试图直接在 didSelectRowAtIndexPath 上的详细视图控制器中设置变量的值,如下所示:self.detailViewController!.detailItem.cheese = "cheddar"。这对我来说绝对不直观。再次感谢。【参考方案2】:

您为什么不直接在您的 Master 中发布来自 didSelectRowAtIndexPath 的通知,并在您的详细视图中添加一个观察者,很可能在您的 viewDidLoad 中。你也可以在观察者方法中使用闭包来处理选择器。

【讨论】:

【参考方案3】:

如果你没有创建一个主从应用程序(所以你没有detailItem),你可以使用这个:

if let
    mySplitViewController = splitViewController,
    detailView = mySplitViewController.childViewControllers.last as? DetailViewController 
        // do something with it
    

【讨论】:

以上是关于拆分视图控制器:如何将主视图控制器连接到详细视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建导航控制器以将主视图控制器连接到 2 个自定义视图控制器

TabBar 在 SplitViewController 的详细视图中。

IOS如何将一个数组连接到另一个视图控制器

在拆分视图控制器的详细视图中制作导航控制器

如何为拆分视图控制器创建启动页面

连接到选项卡栏控制器时,TableView 不会切换到详细视图