Как загрузить изображение из фотобиблиотеки в определенную ячейку коллекции, когда эта ячейка выбрана? - PullRequest
0 голосов
/ 21 ноября 2018

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

(1) Я не уверен, правильно ли я вызываю функцию cellTapped().

(2) Я хочу использовать тег для хранения indexpath.строка, но не уверен, как можно вызвать тег в функции imagepickercontroller.Помощь приветствуется.

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    let cell: UICollectionViewCell = collectionView.cellForItem(at: indexPath)!
    cell.layer.borderWidth = 4.0
    cell.layer.borderColor = UIColor.blue.cgColor
    cellTapped()

}


func cellTapped(){
    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = .photoLibrary
    imagePicker.allowsEditing = false
    present(imagePicker, animated: true, completion: nil)
}


func imagePickerControllerDidCancel(_ picker: UIImagePickerController)
{
    dismiss(animated: true, completion: nil)
}


func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    guard let selectedImage = info[.originalImage] as? UIImage else {
        fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
    }
    dismiss(animated: true, completion: nil)
    collectionView?.reloadData()
}

1 Ответ

0 голосов
/ 21 ноября 2018

Вам нужно запомнить, в какую ячейку вы нажали, прежде чем выбрать изображение.Вы можете сохранить индекс в collectionView (_ :, didSelectItemAt:)

// instance property
private var selectedCellIndexPath: IndexPath?

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    selectedCellIndexPath = indexPath
    let cell: UICollectionViewCell = collectionView.cellForItem(at: indexPath)!
    cell.layer.borderWidth = 4.0
    cell.layer.borderColor = UIColor.blue.cgColor
    cellTapped()

}

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

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    guard let selectedImage = info[.originalImage] as? UIImage else {
        fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
    }
    dismiss(animated: true, completion: nil)

    // let us assume that your collection relies on some array called 'images'
    guard let selectedCellIndexPath = selectedCellIndexPath,
          selectedCellIndexPath.item < images.count else {
          return
    }

    images[selectedCellIndexPath.item] = images
    collectionView?.reloadData()
}
...