在 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 视图控制器时调用。没有分配给您的 ScheduleViewController
的 reservationStore
属性,所以它是 nil
,因此崩溃。
如果您只想将 ReservationStore
的实例分配给 属性,您可以在定义 属性 时将其设置为默认值:
class ScheduleViewController: UITableViewController {
var reservationStore = ReservationStore()
// …
}
我正在尝试在 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 视图控制器时调用。没有分配给您的 ScheduleViewController
的 reservationStore
属性,所以它是 nil
,因此崩溃。
如果您只想将 ReservationStore
的实例分配给 属性,您可以在定义 属性 时将其设置为默认值:
class ScheduleViewController: UITableViewController {
var reservationStore = ReservationStore()
// …
}