2015-07-12 3 views
0

Я использую проект pagemenu https://github.com/uacaps/PageMenu, чтобы включить в мое приложение сегментированный элемент управления для переключения между контроллерами представлений, этот элемент управления состоит из одного контроллера базового представления (PageMenuViewController1) и двух дочерних представлений контроллеры (ViewController1, ViewController2), но когда я запускаю этот PageMenuViewController1 приложение терпит неудачу в контроллерах зрения ребенка (ниже я покажу, где именно приложение терпит неудачу) и выдает эту ошибку:неожиданно нашел нуль при разворачивании необязательного значения в Base ViewController

fatal error: unexpectedly found nil while unwrapping an Optional value 

ниже вы можете увидеть код для viewcontrollers.

Основание View Controller является:

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) 
    } 
} 

детей, разработанные 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 lear :)

ответ

1

Возможно, вы забыли подключить tableViewIBOutlet к просмотру в вашем раскадровке. В желобе, слева от строки кода, который говорит @IBOutlet var tableview: UITableView!, вы должны увидеть круг. Если круг заполнен, то розетка уже подключена. Но если круг пуст, вам нужно его подключить.

Это соединение может быть сделано несколькими способами. Общим методом является использование редактора помощников. Откройте ViewController1.swift на одной панели и откройте Main.storyboard на другой панели. Выберите нужный UITableView в Раскадке. Затем перетащите в пустой круг около IBoutlet в ViewController1.

Если розетка уже подключен (вы можете увидеть полный круг), то вы должны попробовать переместить 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 Sure предмет. IBOutlets не могут быть установлены при вызове viewDidLoad(). Тем не менее, они должны быть установлены по представлению timeWillAppear (:). Таким образом, несмотря на то, что выходы подключены во время разработки, они фактически не используются до тех пор, пока вы не попытаетесь их использовать. Я обновил свой ответ, чтобы уточнить, что я имею в виду. – ndmeiri

+0

хорошая точка @ndmeiri, большое спасибо – Edu

1

Я думаю, как вы инстанцировании ViewController1 и ViewController2 является не верно.

Если вы используете раскадровку, то вы должны создать экземпляр следующим образом:.

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

Если вы не используете раскадровку, то вы должны создать экземпляр с помощью NSBundle.mainModule() loadNibNamed (...).

Просто вызов инициализатора класса не будет прикреплен к раскадровке или xib.

+0

спасибо @abdullah, оцените вашу помощь – Edu

Смежные вопросы

 Смежные вопросы