2015-08-24 3 views
1

У меня есть 30ish языки таблица разделена 4 секции ..Swift: UITableView не обновляет данные должным образом с помощью перезагрузки()

Моя проблема заключается в том, что, когда я хочу, чтобы изменить значение в одной из ячеек, то значение не обновляется/изменяется, пока я не прокручу эту ячейку вне поля зрения и обратно.

Я использую UIAlert, чтобы ввести новое значение, сохранить его в БД .. И значение сохраняется в порядке, и я получаю правильное значение обратно из БД.

Но когда я перезаряжаю tableView, он не отображает новое значение.

Bouns: У меня есть два табличных вида: templateTableView и один по имени: fieldTableView. fieldTableView - это тот, который я пытаюсь изменить в значениях. И изменение tableView.reload() на self!.fieldTableView.reload() тоже не работает.

От didSelectRowAtIndexPath:

}else if currTemplate!.hasPassFail{ 
      var alertController:UIAlertController? 
      alertController = UIAlertController(title: "Enter new value", 
       message: "Enter new value", 
       preferredStyle: .Alert) 

      alertController!.addTextFieldWithConfigurationHandler(
       {(textField: UITextField!) in 
        textField.placeholder = "" 
        textField.keyboardType = UIKeyboardType.NumbersAndPunctuation 
      }) 

      let action = UIAlertAction(title: "Submit", 
       style: UIAlertActionStyle.Default, 
       handler: {[weak self] 
        (paramAction:UIAlertAction!) in 
        if let textFields = alertController?.textFields{ 
         let theTextFields = textFields as! [UITextField] 
         let enteredText = theTextFields[0].text 
         //what to do after edit, here: 
         switch indexPath.section{ 
         case 1: 
          if let value = enteredText.toInt(){ 
           self!.currTemplate!.backgroundMin[indexPath.row] = value 
          }else{ 
           self!.presentViewController(self!.wrongNumberAlert, animated: true, completion: nil) 
           return 
          } 
         case 2: 
          if let value = enteredText.toInt(){ 
           self!.currTemplate!.legendMin[indexPath.row] = value 
          }else{ 
           self!.presentViewController(self!.wrongNumberAlert, animated: true, completion: nil) 
           return 
          } 
         case 3: 
          if let value = enteredText.toDouble(){ 
           self!.currTemplate!.ratioMin[indexPath.row] = value 
          }else{ 
           self!.presentViewController(self!.wrongNumberAlert, animated: true, completion: nil) 
           return 
          } 
         default: 
          0-0 
         } 
         var date = NSDate() 
         self!.currTemplate!.timestamp = date.makeTimestampString() 
         self!.appDelegate.dbInterface.updateTemplate(self!.currTemplate!) 
         //self!.templateArr = self!.appDelegate.dbInterface.findTemplates() 
         self!.findAllNotDeleteOnSync() 
         println("Data was added to DB: \(self!.currTemplate!.ratioMin[indexPath.row])") 
         self!.templateTableView.reloadData() 
         self!.templateTableView.selectRowAtIndexPath(self!.currentTemplateIndex, animated: false, scrollPosition: .None) 
         dispatch_async(dispatch_get_main_queue(),{ 
          tableView.reloadData() 
         }) 
        } 
       }) 
      let cancel = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: nil) 
      alertController?.addAction(cancel) 
      alertController?.addAction(action) 
      self.presentViewController(alertController!, animated: true, completion: nil) 
     } 

Редактировать Часть кода, который должен работал так:

dispatch_async(dispatch_get_main_queue(),{ 
    tableView.reloadData() 
}) 
+0

вы уверены, что подключенное tableviews в раскадровке или инициализировано это правильно? –

+0

Да '@IBOutlet слабый var templateTableView: UITableView!' '@IBOutlet weak var fieldTableView: UITableView!' – Bjqn

+0

r u правильно получить индексный путь uitableviewcell, который редактируется ?? – iAnurag

ответ

1

Эта линия вызывает сбои в работе

if indexPath.row == 0 && indexPath.section == 1 

увидеть тщательно, что вы г писать в этом состоянии вы добавления данных только ablove удовлетворяет условию однако в этом случае в вашем didselectrowatindexpath

case 3: 
if let value = enteredText.toDouble(){ 
self!.currTemplate!.ratioMin[indexPath.row] = value 
}else{ 
self!.presentViewController(self!.wrongNumberAlert, animated: true, completion: nil) 
return 
} 

это получить не удается поэтому никакие данные не добавляются при редактировании строки ur в разделе 2 перемещать код добавления в другом месте или использовать if indexPath.row == 0 && indexPath.section == 1 этого условие

на отдельных участках
+0

Спасибо тонну .. я переместил часть добавления в отдельную функцию и вызвал ее перед 'reload()' table Посмотрите на символ [ЗДЕСЬ] (http://chat.stackoverflow.com/) комнаты/87781/обсуждение-между-bjqn-и-poql) для получения дополнительной информации. – Bjqn

0

Используйте вместо этого:

tableView.reloadData() 
+1

Это именно то, что я сделал. И как я сказал в тексте, что не работает. – Bjqn

1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
    // do DB stuff in background thread 
    // ... 

    dispatch_async(dispatch_get_main_queue(), { 
     // Update UI in main thread when done 
     // ... 
    }) 
}) 
+0

Нет, мне еще нужно прокрутить, чтобы ячейка с измененным значением была вне экрана, а затем назад, чтобы показать новое значение.: S – Bjqn

0

Работы для меня:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
    dispatch_async(dispatch_get_main_queue(), { 
     // Update UI in main thread when done 
     tableView.reloadData() 
    }) 
})