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