Split View Controller: How to connect Master View Controller to Detail View Controller?

被刻印的时光 ゝ 提交于 2019-12-23 01:45:18

问题


(Xcode6-beta3, Swift, iOS8, iPad)

In an iPad split-view controller, how do I link the Master View Controller to the Detail View Controller?

In other words, when the user taps on an item on the left, how do I change the view on the right?

I know that in didSelectRowAtIndexPath, I need to call a method... but how do I call a method in the Detail View Controller from the Master View Controller?

Example

Imagine an app to display information on different types of cheeses. We begin by dragging a split-view controller onto the storyboard. A table of items in the master view on the left is set up to read as follows.

  • Swiss
  • Cheddar
  • Brie

On the right, there is simply a Web View inside of the detail view controller, named cheeseViewController. Therein, HTML documents about the selected cheese will be displayed.

An IBOutlet is wired from the web view into cheeseViewController, and a method named 'changeCheese' is set up in the Detail View Controller delegate to swap out the document.

How can I make a tap on "Cheddar" change the information in the detail view?

EDIT: Do I have to modify my AppDelegate.swift file? Using a Master-Detail template, I tried the following, with no luck:

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:


I hope I understood your problem correctly: You would like to show the detail information of a selected cheese in your Detailview.

When you create a new Master-Detail-View application in XCode 6 Beta 3, there will be a variable called "detailItem" in your DetailViewController.Swift file:

var detailItem: AnyObject? {
    didSet{
        self.configureView()
    }

You set this detailItem in your MasterViewController.Swift file in the following function:

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
   }
}

(Assuming, that you have linked the views with a segue with the identifier: "yourSegueIdentifier" and an array of detailinfo called "yourCheeseArrayWithDetailInformation")

The above mentioned function "configureView" in the DetailView can now access your detailItem, which contains the contents of "cheeese"

I hope this helps you.




回答2:


Why don't you just post a Notification from didSelectRowAtIndexPath in your Master and add an observer in your Detail View most likely inside your viewDidLoad. You also can handle the selector within the observer method with closure.




回答3:


If you didn't create a master-detail app (so you have no detailItem), you might use this:

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


来源:https://stackoverflow.com/questions/24813442/split-view-controller-how-to-connect-master-view-controller-to-detail-view-cont

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!