Anthony Rubin
Anthony Rubin

Reputation: 69

Adding table view to detail view controller

I am in the process of making my first app. Right now I am trying to make a settings page. So far it looks like this. enter image description here

I have the split view controller hooked up to a master view controller and a detail view controller (code below). As you can see, right now there is a table view on the left side of the split view controller containing different buttons. When each button is pressed I want it to display a list of words on the right side of the view controller. It does display a list of words already but I want it to display the words stacked horizontally in a table view and I am not sure how to go about doing this.

//
//  MasterViewController.swift
//  firstapp
//
//  Created by Anthony Rubin on 7/18/17.
//  Copyright © 2017 rubin. All rights reserved.
//

import UIKit

protocol WordSelectionDelegate: class {
func wordSelected(newWord: Word)
}

class MasterViewController: UITableViewController {
var words = [Word]()

weak var delegate: WordSelectionDelegate?

override func viewDidLoad() {
    super.viewDidLoad()



}
required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!

    self.words.append(Word(name: "initial /l/ 1 syllable", description: "lake lamb lamp lark leaf leash left leg lime lion lips list lock log look love lunch"))

    self.words.append(Word(name: "initial /l/ multisyllabic", description: "words, words, words, words"))

    self.words.append(Word(name: "intersyllabic /l/", description: "words, words, words, words"))

    self.words.append(Word(name: "final /l/", description: "words, words, words, words"))

    self.words.append(Word(name: "initial /pl/", description: "words, words, words, words"))

    self.words.append(Word(name: "initial /bl/", description: "words, words, words, words"))

    self.words.append(Word(name: "initial /fl/", description: ""))

    self.words.append(Word(name: "initial /gl/", description: "words, words, words, words"))

    self.words.append(Word(name: "initial /kl/", description: ""))

    self.words.append(Word(name: "initial /sl/", description: ""))

    self.words.append(Word(name: "final /l/ clusters", description: ""))


}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return self.words.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

    // Configure the cell...
    let word = self.words[indexPath.row]
    cell.textLabel?.text = word.name
    return cell
}

override  func tableView(_ tableView: UITableView, didSelectRowAt
    indexPath: IndexPath) {
    let selectedMonster = self.words[indexPath.row]
    self.delegate?.wordSelected(newWord: selectedMonster)
    if let Detail = self.delegate as? Detail {
        splitViewController?.showDetailViewController(Detail, sender: nil)
    }

}

__

import UIKit



class Detail: UIViewController {





@IBOutlet weak var descriptionLabel: UILabel!

var word: Word! {
    didSet (newWord) {
        self.refreshUI()
    }
}

func refreshUI() {

    descriptionLabel?.text = word.description


}

override func viewDidLoad() {

    super.viewDidLoad()
   refreshUI()
}

override func didReceiveMemoryWarning() {

    super.didReceiveMemoryWarning()
}

}
extension Detail: WordSelectionDelegate {
func wordSelected(newWord: Word) {
    word = newWord
}
}

--

class Word {
let name: String
let description: String




init(name: String, description: String) {
    self.name = name
    self.description = description


}
}

--

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let splitViewController = self.window!.rootViewController as! UISplitViewController
    let leftNavController = splitViewController.viewControllers.first as! UINavigationController
    let MasterViewController = leftNavController.topViewController as! MasterViewController
    let Detail = splitViewController.viewControllers.last as! Detail

    let firstWord = MasterViewController.words.first
    Detail.word = firstWord

    MasterViewController.delegate = Detail

    return true
}

PS. If you look at the MasterViewController code you will see where it says "description". the lists contained in description is what should be displayed in the table view on the right.

Upvotes: 0

Views: 906

Answers (1)

Mahesh
Mahesh

Reputation: 1482

In the func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath), of the masterviewcontroller, you need to replace the viewcontroller. Get the splitviewcontroller instance from the appdelegate, now to the splitview controllers view controller property assign your desired viewcontroller object, and make sure your desired view controller object has a navigation controller.

  override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if indexPath.row == 1 {
        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        let splitViewController = appDelegate.window!.rootViewController as! UISplitViewController
        let nextViewController = storyBoard.instantiateViewController(withIdentifier: "yourviewcontrollername") as! UINavigationController
        splitViewController.viewControllers[1] = nextViewController
    }

Upvotes: 0

Related Questions