Reputation: 69
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.
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
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