我使用pagemenu項目https://github.com/uacaps/PageMenu在我的應用程序中包含在視圖控制器之間切換的分段控件,此控件包含一個基本視圖控制器(PageMenuViewController1)和兩個子視圖控制器(ViewController1,ViewController2),但是當我啓動這個PageMenuViewController1應用在子視圖控制器出現故障(下面我準確顯示在應用程序失敗),並拋出這個錯誤:意外地發現爲零,同時在基本視圖控制器中展開可選值
fatal error: unexpectedly found nil while unwrapping an Optional value
下面你可以看到該代碼viewcontrollers。
基本視圖控制器是:
class PageMenuViewController1: UIViewController {
var pageMenu : CAPSPageMenu?
override func viewDidLoad() {
// Array to keep track of controllers in page menu
var controllerArray : [UIViewController] = []
// Create variables for all view controllers you want to put in the
// page menu, initialize them, and add each to the controller array.
// (Can be any UIViewController subclass)
// Make sure the title property of all view controllers is set
// Example:
var controller1 : ViewController1 = ViewController1()
controller1.title = "ViewController1"
controllerArray.append(controller1)
var controller2 : ViewController2 = ViewController2()
controller2.title = "ViewController2"
controllerArray.append(controller2)
// Customize page menu to your liking (optional) or use default settings by sending nil for 'options' in the init
// Example:
var parameters: [CAPSPageMenuOption] = [
.MenuItemSeparatorWidth(4.3),
.UseMenuLikeSegmentedControl(true),
.MenuItemSeparatorPercentageHeight(0.1)
]
// Initialize page menu with controller array, frame, and optional parameters
pageMenu = CAPSPageMenu(viewControllers: controllerArray, frame: CGRectMake(0.0, 0.0, self.view.frame.width, self.view.frame.height), pageMenuOptions: parameters)
// Lastly add page menu as subview of base view controller view
// or use pageMenu controller in you view hierachy as desired
self.view.addSubview(pageMenu!.view)
}
}
子視圖控制器:
- ViewController1
class ViewController1: UIViewController, UITableViewDataSource{
@IBOutlet var tableview:UITableView!
let apiClient = ApiClient()
var clubs: [Club]!
override func viewDidLoad() {
super.viewDidLoad()
apiClient.Service.getList() { clubs, error in
if clubs != nil {
self.clubs = clubs
self.tableview.reloadData()// Here is where the lldb throws the exception
}
else {
println("error: \(error)")
}
}
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.clubs?.count ?? 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("clubObjectCell") as! ClubTableViewCell
cell.clubObject = self.clubs?[indexPath.row]
return cell
}
}
- ViewController2
class ViewController2: UIViewController, UITableViewDataSource {
@IBOutlet var tableview:UITableView!
let apiClient = ApiClient()
var parties: [Party]? = []
override func viewDidLoad() {
super.viewDidLoad()
apiClient.partiesService.getList() { parties, error in
if parties != nil {
self.parties = parties
self.tableview.reloadData()// Here is where the lldb throws the exception
}
else {
println("error: \(error)")
}
}
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.parties?.count ?? 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("partyObjectCell") as! PartyTableViewCell
cell.partyObject = self.parties?[indexPath.row]
return cell
}
}
我希望我的問題這是c學習:)
對不起,但屬性已經鏈接在故事板中,子視圖控制器完全脫離了這個控制,你引用了什麼**你應該嘗試將reloadData()調用移動到viewWillAppear(:)**?你能解釋我多一點嗎? – Edu
@Edu當然可以。當調用viewDidLoad()時,IBOutlet可能不會被設置。但是,它們應該在調用viewWillAppear(:)時設置。因此,即使插座在設計時連接,但在您嘗試使用它們之前,它們實際上並不可用。我已經更新了我的答案,以澄清我的意思。 – ndmeiri
好點@ndmeiri,非常感謝 – Edu