拆分视图控制器:如何将主视图控制器连接到详细视图控制器?
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 个自定义视图控制器