// // MenuViewController.swift // VDSSample // // Created by Matt Bruce on 8/1/22. // import Foundation import UIKit struct MenuComponent { var title: String var viewController: UIViewController.Type } protocol Initable { init() } class MenuViewController: UITableViewController { let items: [MenuComponent] = [ MenuComponent(title: "Checkbox", viewController: CheckboxViewController.self), MenuComponent(title: "CheckboxGroup", viewController: CheckboxGroupViewController.self), MenuComponent(title: "Label", viewController: LabelViewController.self), MenuComponent(title: "RadioButton", viewController: RadioButtonViewController.self), MenuComponent(title: "RadioBoxGroup", viewController: RadioBoxGroupViewController.self), MenuComponent(title: "RadioSwatchGroup", viewController: RadioSwatchGroupViewController.self), MenuComponent(title: "Toggle", viewController: ToggleViewController.self) ] override func numberOfSections(in tableView: UITableView) -> Int { 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { items.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) guard items.count > indexPath.row else { return UITableViewCell() } let item = items[indexPath.row] cell.textLabel?.text = item.title cell.accessoryType = .disclosureIndicator return cell } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard items.count > indexPath.row else { return } let item = items[indexPath.row] if let split = splitViewController { if let type = item.viewController as? StoryboardInitable.Type { let viewController = type.instantiate() viewController.title = item.title split.showDetailViewController(viewController, sender: nil) } else if let type = item.viewController as? Initable.Type { if let viewController = type.init() as? UIViewController { viewController.title = item.title split.showDetailViewController(viewController, sender: nil) } } } else { if let type = item.viewController as? StoryboardInitable.Type { let viewController = type.instantiate() viewController.title = item.title self.navigationController?.pushViewController(viewController, animated: true) } else if let type = item.viewController as? Initable.Type { if let viewController = type.init() as? UIViewController { viewController.title = item.title self.navigationController?.pushViewController(viewController, animated: true) } } } } }