在 UITabBarController 中显示 UITableView 数据的正确模式是什么?

What is the correct pattern to display UITableView data in a UITabBarController?

我正在尝试在 UITabBarController 内的 UITableView 中显示一些(目前是硬编码的)数据,但我在填充行时遇到了困难。

这是我的数据对象的代码 (Reservation.swift)

import UIKit

class Reservation: NSObject {
    var tailNumber: String
    var aircraftType: String
    var arrivalTime: String
    var eta: String

    init(tailNumber: String, aircraftType: String, arrivalTime: String, eta: String) {
        self.tailNumber = tailNumber
        self.aircraftType = aircraftType
        self.arrivalTime = arrivalTime
        self.eta = eta

        super.init()
    }
}

这是我的预订商店的代码 (ReservationStore.swift)

import UIKit

class ReservationStore {
    // Store all our schedules
    var allReservations = [Reservation]()

    func createReservation() -> Reservation {
        let newReservation = Reservation(tailNumber: "N53440", aircraftType: "C172S", arrivalTime: "07-06-2016 07:00am", eta: "1:58")

        allReservations.append(newReservation)

        return newReservation
    }

    init() {
        createReservation()
    }
}

这是我的 UITableView 视图控制器 (ScheduleViewController.swift)

import UIKit

class ScheduleViewController: UITableViewController {
    var reservationStore: ReservationStore!

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return reservationStore.allReservations.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("UITableViewCell", forIndexPath: indexPath)
        let item = reservationStore.allReservations[indexPath.row]

        cell.textLabel?.text = item.tailNumber

        return cell
}

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let reservationStore = ReservationStore()

        let tabController = segue.destinationViewController as! UITabBarController
        let reservationController = tabController.viewControllers![1] as! ScheduleViewController

        reservationController.reservationStore = reservationStore
    }   
}

我收到一个致命错误:在 return reservationStore.allReservations.count

上展开可选值时意外发现 nil

我相信 prepareForSegue 会在用户单击日程表的 UITabController 项目时调用,就在视图加载之前。这应该会触发我的 ReservationStore 中的 init() 并在数组中创建一个元素,但我认为这不会发生,因为在计算数组时它为零?

也许这个创作应该在 prepareForSegue 中?搞砸了一天左右,不确定下一步该去哪里,有人能给我指明正确的方向吗?

prepareForSegue() 在视图加载之前不会被调用。它在 that 视图控制器准备转至 new 视图控制器时调用。没有分配给您的 ScheduleViewControllerreservationStore 属性,所以它是 nil,因此崩溃。

如果您只想将 ReservationStore 的实例分配给 属性,您可以在定义 属性 时将其设置为默认值:

class ScheduleViewController: UITableViewController {
    var reservationStore = ReservationStore()

    // …
}