2016-03-17 2 views
0

Обновлено: Мой FIXSwift - TableView с помощью PLIST не перезаряжать после добавления новых данных

Это то, что фиксированная моя проблема, и это может помочь вам!

override func viewDidAppear(animated: Bool) { 
    authors = loadPlist() 
    tableView.reloadData() 
} 

Теперь загружает данные отлично :)

У меня возникли проблемы с моим кодом. У меня есть plist, который я изменяю и добавляю записи.

Все работает нормально, но мне нужно перезапустить iOS-симулятор, чтобы увидеть вновь добавленные записи plist.

Чтобы быстро суммировать, все обновляется в файле plist, но для этого требуется, чтобы приложение было перестроено.

Я пробовал tableView.reloadData(), но я понимаю, что как только viewDidLoad() запускается только один раз.

Теперь я попытался обойти это, создав дополнительные соединения Segue назад и четвертым, но я нашел этот счетчик продуктивным и громоздким.

Большое спасибо!

P.S

У меня есть чувство, что я не сохраняющееся данные правильно?

Как получить информацию из списка свойств, при создании копии:

private func loadPlist() -> NSArray { 
     var data = NSArray() 
     // attempt to open "authors.plist" from the application's Documents/ directory 
     let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
      as NSArray 
     let documentsDirectory = paths.objectAtIndex(0) as! NSString 
     let path = documentsDirectory.stringByAppendingPathComponent("authors.plist") 
     let fileManager = NSFileManager.defaultManager() 
     // if the file is not available (first access), then open it from the app's 
     // mainBundle Resources/ folder: 

     if(!fileManager.fileExistsAtPath(path)) { 
      let plistPath = NSBundle.mainBundle().pathForResource("authors", ofType: "plist") 

      data = NSArray(contentsOfFile: plistPath!)! 

      do { 
       try fileManager.copyItemAtPath(plistPath!, toPath: path) 
      } catch let error as NSError { 
       // failure 
       print("Error copying plist file: \(error.localizedDescription)") 
      } 
      print("First launch... Default plist file copied...") 
      data.writeToFile(path, atomically: true) 
     } 
     else { 
      data = (NSArray(contentsOfFile: path))! 
     } 
     return data 
    } 

Для сохранения данных:

func saveData(){ 

     let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
      as NSArray 
     let documentsDirectory = paths.objectAtIndex(0) as! NSString 
     let path = documentsDirectory.stringByAppendingPathComponent("authors.plist") 

     if let plistArray = NSMutableArray(contentsOfFile: path) { 
      //... 
      //... 
      plistArray.writeToFile(path, atomically: false) 
     } 

    } 

кнопки Сохранить:

@IBAction func saveDataButton(sender: UIBarButtonItem) { 

      saveData() 
      navigationController?.popViewControllerAnimated(true) 

    } 

Как я заселение моего TableView :

let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) 

     if let author = authors[indexPath.row] as? [String: AnyObject], let name = author["Author"] as? String { 
      // Configure Cell 
      cell.textLabel?.text = name 
     } 
     return cell; 

мой viewDidLoad() теперь:

override func viewDidLoad() { 
     super.viewDidLoad() 

     title = "Authors" 
     authors = loadPlist() 
     tableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: cellIdentifier) 
     tableView.delegate = self; 
     tableView.dataSource = self; 
     tableView.reloadData() 
    } 
+0

Извините, что вы переполняете стоп и не спать: P – Th30

+1

@ Th30 В реализации делегата datasource datasource в tableview, как вы определяете, сколько строк вы возвращаете, также я думаю, вы можете быть смущены тем, как работает метод reloadData, он может быть вызван как много раз, как вы хотите, и по звукам этого, это то, что вы ищете –

ответ

0

Вы, кажется, очень смущен. Да, viewDidLoad получает вызов только один раз в течение срока действия контроллера вида.

Вы должны вызвать метод loadData один раз в viewDidLoad.

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

Как пользователь вносит изменения в записи в виде таблицы, примените эти изменения к вашему изменяемому массиву. Создайте методы источника данных в виде таблицы для получения данных из этого изменяемого массива.

Ваш метод храненияДата неверна. Сначала он считывает plist с диска (уничтожая любые изменения, внесенные пользователем), а затем записывает их обратно. Конечным результатом является то, что он ничего не делает. Прочитайте чтение в начале функции и вместо этого сохраните измененный массив, который имеет изменения в нем, обратно в файл plist.

+0

StoreData не завершен, это макет, извините, я сохранил некоторые вещи, потому что это основное задание. – Th30

+0

Не то, чтобы это было неполным, это то, что это совершенно неправильно. –

+0

Объяснит ли это, почему перезагрузка приложения загружает сохраненные данные? Я могу заверить, что мои данные не переписывают что-либо, я проверил его. EDIT: Я думаю, я вижу, что вы имеете в виду @ Duncan C – Th30

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