2016-01-23 1 views
0

Я создаю облачный табло. Я загружаю приложение, и мое табличное представление появляется с моими записями из облачного набора.Как перезагрузить табличное представление после добавления новой записи?

Затем я использую метод добавления insertNewObject, который добавляет запись в набор облаков, но это не отображается в моем представлении таблицы. Он будет отображаться только при следующем запуске приложения.

func insertNewObject(sender: AnyObject) { 

    let record = CKRecord(recordType: "CloudNote") 
    record.setObject("New Note", forKey: "Notes") 

    MyClipManager.SaveMethod(Database!, myRecord:record) 
    dispatch_async(dispatch_get_main_queue()) { 
     self.tableView.reloadData() 
    } 


    } 

Это мой метод добавления. Я вызываю перезагрузку таблицы, как вы можете видеть, но ничего не происходит.

Мой код создания TableView:

// Tableview stuff --- Done 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 
     /////// Get number of rows 
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return objects.count 
} 
     //// FIll the table 
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 

    let object = objects[indexPath.row] 
    cell.textLabel!.text = object.objectForKey("Notes") as? String 
    return cell 
} 

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
    // Return false if you do not want the specified item to be editable. 
    return true 
} 

В соответствии с просьбой: метод, который позволяет экономить до CloudDB

func SaveMethod(publicDatabase: CKDatabase, myRecord: CKRecord) -> CKRecord { 

    publicDatabase.saveRecord(myRecord, completionHandler: 
     ({returnRecord, error in 
      if let err = error { 
       self.notifyUser("Save Error", message: 
        err.localizedDescription) 
      } else { 
       dispatch_async(dispatch_get_main_queue()) { 
        self.notifyUser("Success", 
         message: "Record saved successfully") 
       } 


      } 
     })) 
return myRecord 
} 

Мой метод viewdidload в MasterView:

override func viewDidLoad() { 
     super.viewDidLoad() 
     // Database loading on runtime 
     Database = container.privateCloudDatabase 

     ///Build Query 
     let query = CKQuery(recordType: "CloudNote", predicate: NSPredicate(format: "TRUEPREDICATE")) 

     ///Perform query on DB 
     Database!.performQuery(query, inZoneWithID: nil) { (records, error) -> Void in 
      if (error != nil) { 
       NSLog("Error performing query. \(error.debugDescription)") 
       return 
      } 

      self.objects = records! 

      dispatch_async(dispatch_get_main_queue()) { 
       self.tableView.reloadData() 
      } 

     } 
+1

что этот метод, MyClipManager.SaveMethod (база данных !, myRecord: record) do ?? – satheeshwaran

+1

'reloadData' ничего не поможет, если вы не обновите источник данных в виде таблицы. Где вы добавляете объект в массив 'objects'? – rmaddy

+0

Привет, я добавил обновление с помощью SaveMethod. он сохраняет массив в наборе облаков. – Malorrr

ответ

2

Вы не должны перезагрузить свой цельные tableView при вставке одного объекта. Только делайте это, когда знаете ВСЕ данные изменились.

Чтобы сделать то, что вы хотите, это порядок:

    • Вставьте новый объект данных в ваш источник данных (self.objects). Убедитесь, что вы получили индекс, где он заканчивается в массиве.
    • Вызов insertRowAtIndexPath: с правильной indexPath на вашем Tableview. Это позволит убедиться, что ваши данные и TableView снова синхронизированы, а tableView: cellForRowAtIndexPath: вызывается, по крайней мере, для вашего нового объекта данных (и возможных других, поскольку некоторые ячейки теперь могут повторно использоваться для отображения других данных).

Обратите внимание, что порядок всегда: обновить данные, а затем обновить пользовательский интерфейс (единственное место, я знаю, что его волосатый будет при использовании UISwitch).

+0

спасибо за ответ. это имеет большой смысл. Один вопрос: Как бы я узнал, в какой индекс вставлена ​​моя новая запись, я предполагаю, что это должно быть сделано в моем методе сохранения и возвращено? – Malorrr

+0

Да, вы можете вернуть его из своего метода сохранения (убедитесь, что это метод, который 'throws', так что ваш dataSource знает, когда метод завершился неудачно, и НЕ должен вставлять новую строку в tableView). Итак, в основном: ваш вновь созданный объект данных окажется в переменной 'objects'. Если это измененный массив (не используйте его для разных потоков!), Вы можете добавить свой новый объект данных через 'insertAtIndex:' или 'addObject:'.С первым вы определяете индекс, с последним индексом будет счет, прежде чем вы добавите объект. – Joride