2016-10-28 4 views
0

В моем приложении пользователь может выбрать изображение с помощью imagepicker. После того, как он выбрал, я хочу обновить свой вид коллекции (или tableview) с новым изображением. Но даже если вызываются перезагрузки funcs и новый элемент в моем списке, пользовательский интерфейс не обновляется.Добавить данные и перезагрузить CollectionView после увольнения ImagePicker - Swift - iOS

EDIT TO HIGHLIGHT ЭТО: Я упрощаю код с отменой отмены вместо этого, потому что поведение такое же. Я знаю, что мне нужно позвонить didFinishWith ... но я хочу выделить поведение, вызванное увольнением.

var files = [File]() // populate my collectionview or tableview 

// ... code 
// ... more code 

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 

    self.dismiss(animated: true) { 

     let newFile = File(name: "test") 
     self.files.append(newFile) 

     DispatchQueue.main.async { 
      self.collectionView?.reloadData() 
      // self.tableView?.reloadData() has the same behavior 
     } 
    } 
} 

Если я печатаю в CollectionView-CellForItemAt ... Я вижу, что у меня есть новый элемент в списке, но не показывают на экране.

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

(я уже вижу эту тему: UICollectionView won't reloadData() after UIImagePickerController dismisses)

EDIT для получения дополнительной информации:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 

    return self.files.count 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ItemCell", for: indexPath) as! CollectionViewCell 

     cell.file = self.files[indexPath.row] 
     cell.filenameLabel.text = self.files[indexPath.row].name 
     // other customization of cell 
     print(cell.file.name) 
     return cell 
    } 
+0

Вы должны использовать этот метод: 'didFinishPickingMediaWithInfo' и показать свой код 'CellForItemAt' –

+0

@Lyume Я думаю, что для этого типа требования вы должны пойти с PHASSET –

+0

Как я уже сказал, я просто покажу вам пример с отменой, чтобы упростить понимание. – Lyume

ответ

1

Вы реализуете imagePickerControllerDidCancel. Если пользователь выбирает изображение сборщик не вызывает делегат с imagePickerControllerDidCancel, он вызывает didFinishPickingMediaWithInfo

+0

Я знаю, я просто упрощаю код, потому что поведение такое же. – Lyume

+0

вместо вызова .reloadData() collectionView.insertItems (at :) Этот метод утверждает, что ваша модель не соответствует коллекцииView, что, вероятно, так. Утверждение должно сказать вам, если вам не хватает клеток. –

0

Попробуйте мой Objective C код:

[objCollectionView reloadData]; 

[objCollectionView.collectionViewLayout invalidateLayout]; 

[objCollectionView performBatchUpdates:^{ 
       } completion:^(BOOL finished) { 

       }]; 
+0

Спасибо, но ничего не меняется. У меня все еще есть объект в консоли, но не в пользовательском интерфейсе. – Lyume

+0

self.files.append (newFile), что это такое? и что такое тип self.files? – KKRocks

+0

self.files заполняет мою коллекциюView и является типом [File]. Файл - это простой объект с именем, изображением и т. Д. Я редактирую свой пост, чтобы вы могли видеть, где я использую self.files – Lyume