Skip to content

Instantly share code, notes, and snippets.

@exorcyze
Created January 6, 2021 15:49
Show Gist options
  • Save exorcyze/701721524a72029805440ccb27cda0d8 to your computer and use it in GitHub Desktop.
Save exorcyze/701721524a72029805440ccb27cda0d8 to your computer and use it in GitHub Desktop.
//
// TestDetailController
// Created / Copyright © : Mike Johnson, 2021
//
import Foundation
import UIKit
// MARK: - Lifecycle Methods
class TestDetailController : UIViewController {
private let mytable = UITableView( frame: .zero, style: .plain )
private var data = [RowModel]()
override func viewDidLoad() {
super.viewDidLoad()
setupInterface()
setupLayout()
setupData()
}
}
// MARK: - Public Methods
extension TestDetailController {
}
// MARK: - Private Methods
private extension TestDetailController {
func setupInterface() {
title = "Login w/ Biometrics"
mytable.register( UITableViewCell.self, forCellReuseIdentifier: "cell" )
mytable.dataSource = self
mytable.delegate = self
mytable.tableFooterView = UIView()
view.addSubview( mytable )
}
func setupLayout() {
mytable.constrainWidth()
mytable.constrainHeight()
}
func setupData() {
data = [
RowModel(key: "logout", title: "Log Out", detail: "Result: Success", function: onBlank),
RowModel(key: "enableBio", title: "Enable Biometrics", detail: "Result: Enabled", function: onBlank),
RowModel(key: "login", title: "Log In", detail: "", function: onBlank),
]
mytable.reloadData()
}
func onBlank( _ model: RowModel ) {
log( "Selected \(model.key)", type: .base )
}
}
// MARK: - UICollectionView
extension TestDetailController: UITableViewDataSource, UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell( style: .subtitle, reuseIdentifier: "cell" )
let myitem = data[ indexPath.row ]
cell.textLabel?.text = myitem.title
cell.detailTextLabel?.text = myitem.detail
cell.detailTextLabel?.textColor = .gray
cell.accessoryType = .disclosureIndicator
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 60
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let myitem = data[ indexPath.row ]
myitem.function( myitem )
tableView.deselectRow( at: indexPath, animated: true )
}
}
// MARK: - Preview
#if canImport(SwiftUI) && DEBUG
private extension TestDetailController {
static var mock: UINavigationController {
let view = TestDetailController()
let nav = UINavigationController(rootViewController: view)
return nav
}
}
import SwiftUI
@available(iOS 13.0, *)
struct TestDetailController_Preview: PreviewProvider {
static var previews: some View {
TestDetailController.mock.asPreview()
}
}
#endif
//
// TestHarnessController
// Created / Copyright © : Mike Johnson, 2021
//
import Foundation
import UIKit
// MARK: - Models
struct RowModel {
let key: String
let title: String
let detail: String
let function: ((RowModel) -> Void)
}
struct SectionModel {
let title: String
let items: [RowModel]
}
// MARK: - Lifecycle Methods
class TestHarnessController : UIViewController {
private let mytable = UITableView( frame: .zero, style: .grouped )
private var data = [SectionModel]()
override func viewDidLoad() {
super.viewDidLoad()
setupInterface()
setupLayout()
setupData()
}
}
// MARK: - Public Methods
extension TestHarnessController {
}
// MARK: - Private Methods
private extension TestHarnessController {
func setupInterface() {
title = "Test App"
mytable.register( UITableViewCell.self, forCellReuseIdentifier: "cell" )
mytable.dataSource = self
mytable.delegate = self
view.addSubview( mytable )
}
func setupLayout() {
mytable.constrainWidth()
mytable.constrainHeight()
}
func setupData() {
data = [
SectionModel(title: "Settings", items: [
RowModel(key: "environment", title: "Environment", detail: "Staging", function: onBlank),
RowModel(key: "features", title: "FeatureFlags", detail: "", function: onBlank),
]),
SectionModel(title: "Functions", items: [
RowModel(key: "logout", title: "Log Out", detail: "", function: onBlank),
RowModel(key: "login", title: "Log In", detail: "", function: onBlank),
RowModel(key: "enableBio", title: "Enable Biometrics", detail: "", function: onBlank),
RowModel(key: "enableLLS", title: "Enable LLS", detail: "", function: onBlank),
]),
SectionModel(title: "Use Cases", items: [
RowModel(key: "login", title: "Standard Login", detail: "", function: onBlank),
RowModel(key: "login.bio", title: "Login w/ Biometrics", detail: "", function: onBlank),
]),
]
mytable.reloadData()
}
func onBlank( _ model: RowModel ) {
log( "Selected \(model.key)", type: .base )
navigationController?.pushViewController( TestDetailController(), animated: true )
}
}
// MARK: - UICollectionView
extension TestHarnessController: UITableViewDataSource, UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return data.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return data[section].title
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data[section].items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell( style: .subtitle, reuseIdentifier: "cell" )
let myitem = data[ indexPath.section ].items[ indexPath.row ]
cell.textLabel?.text = myitem.title
cell.detailTextLabel?.text = myitem.detail
cell.detailTextLabel?.textColor = .gray
cell.accessoryType = .disclosureIndicator
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 60
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let myitem = data[ indexPath.section ].items[ indexPath.row ]
myitem.function( myitem )
tableView.deselectRow( at: indexPath, animated: true )
}
}
// MARK: - Preview
#if canImport(SwiftUI) && DEBUG
private extension TestHarnessController {
static var mock: UINavigationController {
let view = TestHarnessController()
let nav = UINavigationController(rootViewController: view)
return nav
}
}
import SwiftUI
@available(iOS 13.0, *)
struct TestHarnessController_Preview: PreviewProvider {
static var previews: some View {
TestHarnessController.mock.asPreview()
}
}
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment