2015-07-12 29 views
0

我使用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學習:)

回答

1

很可能,您忘記將tableViewIBOutlet屬性連接到故事板中的視圖。在排水溝中,在@IBOutlet var tableview: UITableView!的代碼行左側,您應該看到一個圓圈。如果圓圈被填滿,那麼插座已經連接。但是如果圓圈是空的,你需要連接它。

此連接可以通過幾種不同的方式進行。常用的方法是使用助手編輯器。在一個窗格上打開ViewController1.swift,並在另一個窗格上打開Main.storyboard。在故事板中選擇合適的UITableView。然後,控制 - 拖動到IBoutletViewController1附近的空圓圈。

如果您的插座已連接(你可以看到一整圈),那麼你應該嘗試移動reloadData()調用viewWillAppear(:)像這樣:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    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)") 
     } 
    } 
} 
+0

對不起,但屬性已經鏈接在故事板中,子視圖控制器完全脫離了這個控制,你引用了什麼**你應該嘗試將reloadData()調用移動到viewWillAppear(:)**?你能解釋我多一點嗎? – Edu

+1

@Edu當然可以。當調用viewDidLoad()時,IBOutlet可能不會被設置。但是,它們應該在調用viewWillAppear(:)時設置。因此,即使插座在設計時連接,但在您嘗試使用它們之前,它們實際上並不可用。我已經更新了我的答案,以澄清我的意思。 – ndmeiri

+0

好點@ndmeiri,非常感謝 – Edu

1

我想你是實例ViewController1和ViewController2的方法是不正確。

如果您使用的故事板,那麼你必須實例如下:如果您使用的不是故事板,那麼你必須實例使用NSBundle.mainModule()

var controller1 : ViewController1 = storyboard.instantiateViewControllerWithIdentifier("<view controller 1 identifier in storyboard>") 

loadNibNamed(...)。

只調用類初始化程序不會將它們附加到故事板或xib。

+0

謝謝@abdullah,感謝您的幫助 – Edu

相關問題