2015-06-10 4 views
1

Я создал табличный вид в контроллере представления и пытаюсь установить количество строк, которое у него будет. Сумма возвращается из базы данных и затем переходит к правильному методу (см. Ниже). Проблема в том, что количество видимых строк - это не то же количество, которое возвращается из базы данных.UITableView не отображает правильное количество строк

В .viewDidLoad()

self.activeIDs.delegate = self 
    self.activeIDs.dataSource = self 
    self.activeIDs.rowHeight = 30 
    self.activeIDs.reloadData() 

Методы, которые должны "настроить" вид таблицы

func tableView(tableView: UITableView, 
    cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ 
     let cell = activeIDs.dequeueReusableCellWithIdentifier("idCell", forIndexPath: indexPath) as UITableViewCell 

     cell.textLabel!.text = "Test" 

     return cell 
} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(tableView: UITableView, 
    numberOfRowsInSection section: Int) -> Int { 
     var numberOfRows = 0 //Assigning default value 
     SQLHandler.getActiveIDAmount { 
      amountOfIDs in 
      numberOfRows = amountOfIDs.description.toInt()! 
      println(numberOfRows) //Displays correct (database) value 
     } 
    return numberOfRows //Returns correct value EDIT: wrong value. 
} 

Вместо того, чтобы получать желаемое количество строк (4) Я всегда, несмотря на ценность, которую я получаю из базы данных, заканчивается 6? Скриншот таблицы в действии: http://gyazo.com/753f326177dc8cd6b1734f4d19681d71

В чем проблема? Что я делаю не так?

ответ

2

Метод, который вы вызываете SQLHandler, является обработчиком завершения, что означает, что swift продолжит выполнение кода и сразу после (и возвращает numberOfRowns = 0), чем после (после завершения запроса) он вернется к блок:

SQLHandler.getActiveIDAmount { 
      amountOfIDs in 
      numberOfRows = amountOfIDs.description.toInt()! 
      println(numberOfRows) //Displays correct (database) value 
      //add the values returned to your dataset here 
      //call refresh table and dispatch in the main thread in case 
      //this block is running in a background thread 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       self.tableView.reloadData() 
      }) 
} 

и напечатать количество строк.

Что нужно сделать, так это позвонить функции SQLHandler.getActiveIDAmount в другом месте вашего кода и call table.reloadData() после завершения обратного вызова.

Надеюсь, это вам поможет!

+0

Прошу прощения, но я не понимаю. Если бы я снова вызвал SQLHandler.getActiveIDAmount, не нужно ли мне вводить ту же информацию между {}, как и раньше, чтобы не решить проблему? Я сделал несколько тестов и выяснил, что после возвращения numberOfRows на самом деле было 0, его значение по умолчанию. Вероятно, стоит также упомянуть, что я попытался использовать этот «обработчик завершения», чтобы исправить проблему, когда асинхронная выборка базы данных не вернула правильное значение, предназначенное для строк. – Tice

+0

Вы публикуете в своем вопросе «println (numberOfRows) // Отображает правильное значение (база данных)», поэтому это означает, что ваш запрос базы данных работает, но вы неправильно используете набор данных. Вам не нужно вызывать метод дважды, только один раз, и использовать полученный набор данных для заполнения таблицыView – Icaro

+0

Но разве это не то, что я делаю? (Кстати, я обновил свой вопрос, так как кажется, что возвращаемое значение действительно неверно). Я извлекаю количество строк, которые мне нужны, просто не изменилось значение для numberOfRows (которое возвращается) (numberOfRows = amountOfIDs.description.toInt (!))? – Tice

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