2016-03-11 6 views
0

Я пытаюсь реализовать UITableView. Я уже смог заставить его работать, но он продолжал показывать строки в пустых ячейках, поэтому я посмотрел онлайн и нашел решение, которое должно было разместить UIView в tableFooterView, поэтому я сделал это:UITableView генерирует исключение при добавлении UIView в tableFooterView

В первом представлении таблицы, которое я настроил, он работал нормально, но знаю, что я пытаюсь реализовать вторую и не работать. Если я запускаю его без строки выше, все работает нормально, но я получаю строки в пустых ячейках. Если я бегу с линией выше, я получаю «неустранимая ошибка: неожиданно обнаружил ноль, а разворачивание необязательное значение», и XCode указывает на ошибку в этой строке:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int)  -> Int { 
     return self.itemsList.count // Throws error: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 
} 

Кто-нибудь знает, почему это происходит? Или как я могу это исправить? Или, если есть лучший, более быстрый способ скрыться от строк на пустых ячейках? Благодаря!

Вот мой UIViewController класс для справки:

class InfoPickerViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

@IBOutlet weak var infoPicker: UITableView! 

private var pageTitle: String! 
private var itemsList: [String]! 

convenience init(title: String){ 
    self.init() 

    self.pageTitle = title 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.navigationController?.navigationBar.tintColor = UIColor.whiteColor() 
    self.title = self.pageTitle 

    self.infoPicker.delegate = self 
    self.infoPicker.dataSource = self 
    self.infoPicker.tableFooterView = UIView() 
    self.infoPicker.registerNib(UINib(nibName:"SimpleTableViewCell", bundle: nil), forCellReuseIdentifier: "simpleCell") 

    populateItemsList() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func populateItemsList() { 
    let clientsInfo = ClientsInfo() 
    self.itemsList = [] 

    switch self.pageTitle { 
     case "Cliente": self.itemsList = clientsInfo.getClientsList() 
     default: self.itemsList = [] 
    } 
} 

// MARK: TableView 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.itemsList.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let listItemCell = infoPicker.dequeueReusableCellWithIdentifier("simpleCell", forIndexPath: indexPath) as! SimpleTableViewCel 

    listItemCell.itemLabel.text = self.itemsList[indexPath.row] 

    return listItemCell 
} 

} 
+0

Хорошо, мне удалось заставить его работать, добавляя UIView непосредственно в файл .xib, а не программно. Тем не менее, я хотел знать, откуда исходит ошибка. –

+0

Я описал, где ошибка появилась в моем ответе. У вас есть неинициализированный 'itemsList: [String]!', Когда ваш 'numberOfRowsInSection' пытается получить доступ к значению, значение равно nil и ваше приложение аварийно завершает работу. Мое решение разрешает это, предоставляя вашему массиву начальное значение. –

ответ

1

Я не мой макинтош со мной, но я дам этому выстрел. В верхней части вашего ViewController, обновите следующую строку:

private var itemsList: [String] = [] { 
    didSet { 
     dispatch_async(dispatch_get_main_queue(), { 
      self.tableView.reloadData() 
     }) 
    } 
} 

Мы инициализация вашего itemsList массива, который будет иметь счетчик элемента 0, таким образом ваш numberOfRowsInSection не врезаться, потому что ваш itemsList является nil. Затем, когда ваша функция populateItemsList дает реальное значение itemsList, ваш вид таблицы перезагружается данными в основном потоке.


от комментариев:

я описал, где пришел ошибка из в моем ответе. У вас есть неинициализированный itemsList: [String]!, когда ваш numberOfRowsInSection пытается получить доступ к значению, это значение равно нулю, и ваше приложение сработает. Мое решение разрешает это, предоставляя вашему массиву начальное значение.

+0

Я всегда делаю эту ошибку. благодаря –

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