// // MenuViewController.swift // VDSSample // // Created by Matt Bruce on 8/1/22. // import Foundation import UIKit import VDS struct MenuComponent { var title: String var viewController: UIViewController.Type } protocol Initable { init() } class MenuCell: UITableViewCell { var label = Label().with { $0.typograpicalStyle = .BodyLarge } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) setup() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setup(){ addSubview(label) label.pinToSuperView(.init(top: 0, left: 16, bottom: 0, right: 0)) } } class MenuViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() overrideUserInterfaceStyle = .light tableView.register(MenuCell.self, forCellReuseIdentifier: "cell") } let items: [MenuComponent] = [ MenuComponent(title: "Badge", viewController: BadgeViewController.self), MenuComponent(title: "Button", viewController: ButtonViewController.self), MenuComponent(title: "ButtonGroup", viewController: ButtonGroupViewController.self), MenuComponent(title: "Checkbox", viewController: CheckboxViewController.self), MenuComponent(title: "CheckboxGroup", viewController: CheckboxGroupViewController.self), MenuComponent(title: "Label", viewController: LabelViewController.self), MenuComponent(title: "RadioBoxGroup", viewController: RadioBoxGroupViewController.self), MenuComponent(title: "RadioButtonGroup", viewController: RadioButtonViewController.self), MenuComponent(title: "RadioSwatchGroup", viewController: RadioSwatchGroupViewController.self), MenuComponent(title: "TextEntryField", viewController: TextEntryFieldViewController.self), MenuComponent(title: "TextLink", viewController: TextLinkViewController.self), MenuComponent(title: "TextLinkCaret", viewController: TextLinkCaretViewController.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, heightForRowAt indexPath: IndexPath) -> CGFloat { 50.0 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard items.count > indexPath.row, let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? MenuCell else { return UITableViewCell() } let item = items[indexPath.row] cell.label.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) } } } } }