はじめに
最近コードでレイアウトを組んでいるのでその備忘録。ネット上にあまり情報がなかったので残しときます。改善点などがあればコメントして欲しいです。🙇♂️なお、外部ライブラリのSnapKit
を使っています。
完成するアプリの動きとしては
こんな感じになります。
一つ目の画面
つまづいたポイントとしては
-
tableView.register
を忘れていた。 -
dequeueReusableCell
を使っていなかった。
regesiter
はAutoLayoutだと記述しないので忘れがち。画面遷移しないと思ったらここが原因かも。dequeueReusableCell
はセルを再利用して処理が重くなるのを防ぎます。カクカクしていたらここを見直すのもありかも。
import UIKit
final class TableViewController: UITableViewController {
var numbers: [String] = ["リンゴ","ビスケット","砂糖"]
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
navigationItem.title = "Center"
tableView.dataSource = self
tableView.delegate = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numbers.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = numbers[indexPath.row]
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("selected")
let centerSecondViewController = CenterSecondViewController()
self.navigationController?.pushViewController(centerSecondViewController, animated: true)
}
}
二つ目の画面
特に何もしていません。が、view.backgroundColor = .green
がないと画面がカクカクした画面遷移になってしまいます。
import UIKit
class CenterSecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .green
}
}
SceneDelegate
これはUINavigationViewCOntroller編のものとほとんど同じです。
cellをタップしても画面遷移しない時などはここでUINavigationViewControllerのrootViewに設定していないことが原因かもしれません。
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var navigationVC: UINavigationController!//加えた
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
guard let _ = (scene as? UIWindowScene) else { return }
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
let tableVC = TableViewController()
navigationVC = UINavigationController(rootViewController: tableVC)
window.rootViewController = navigationVC
self.window = window
window.makeKeyAndVisible()
}
}
//ここからしたは変えてない
func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
}
func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
}
UIViewCOntrollerにtableViewを追加する場合
import UIKit
import RealmSwift
final class ViewController: UIViewController {
var numbers: [String] = ["リンゴ","ビスケット","砂糖"]
fileprivate var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
navigationController?.title = "タスク"
tableView = UITableView(frame: self.view.bounds, style: .plain)
tableView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
tableView.delegate = self
tableView.dataSource = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
view.addSubview(tableView)
}
}
extension TaskListViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
numbers.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = numbers[indexPath.row]
return cell
}
}