2016-11-30 2 views
1

Я пытаюсь создать приложение рецепта с функцией загрузки рецепта. В PostController будет tableview всех этапов приготовления, каждый из которых находится в ячейке таблицы. в ячейке будет текстовое поле и UIImageView для загрузки изображения (изображение, выбранное из pickerController, будет отображаться в этом UIImageView для последующей загрузки). Я пытаюсь сделать imageViewInCell.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageUpload))) , чтобы вызвать функцию handleImageUpload(), которая создает UIImagePickerController. Но, выполнив это, я встретил две проблемы.Использование UIImagePickerController в каждой ячейке tableview

  1. Я не могу получить значение ячейки index.row селектором в UITapGestureRecognizer, с вне индекса не могу присвоить выбранное изображение обратно в UIImageView клетки.
  2. Даже если я получил index.row в handleImageUpload, мне все еще нужна функция ниже, чтобы назначить выбранное изображение. Как эта функция примет мой параметр и найдет соответствующий imageViewInCell?

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
        if let selectedImage: UIImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
         imageViewInCell.image = selectedImage 
        } 
        dismiss(animated: true, completion: nil) 
    } 
    
+1

Зачем использовать жест tap, а не didSelectRowAtIndexPath? –

+0

Я добавил UITapGesture для imageView, потому что эта операция просто связана только с изображением. Использование didSelectRowAtIndexPath не может быть выбором, потому что в ячейке есть текстовое поле. –

+0

Наконец, я сохранил индекс как с глобальной переменной 'selectedIndex' (используемой' didFinishPickingMediaWithInfo'), так и с 'cell.imageViewInCell.tag' (используемой' handleImageUpload() '), каждый раз, когда вызывается' handleImageUpload() ', он присваивает 'selectedIndex' значение' cell.imageViewInCell.tag'. В 'didFinishPickingMediaWithInfo' требуется глобальная переменная для поиска соответствующей ячейки. –

ответ

1

вы можете установить indexPath.row как тег вашего ImageView в cellForRowAtIndexPath, как показано ниже

cell.yourImageView.tag = indexPath.row 

, а затем вы можете получить этот indepath backagain используя ниже

let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0) 
let cell = tableView.cellForRowAtIndexPath(indexPath) as! yourcellClass! 
cell.yourImgeView.image = selectedImage 
+0

Эта идея помогает. Проблема решена сейчас, спасибо! –

+0

приветствуем счастливое кодирование .... –

0

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

Теперь, чтобы ответить на ваш вопрос, назначить тег в ImageView, как это:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
//cell configuration 
cell.imageView.tag = indexPath.row 
return cell 
} 

И вы можете присвоить выбранное изображение выбранной ячейки, как это:

Теперь ваш handleImageUpload() является:

func handleImageUpload(_ sender: UITapGestureRecognizer){ 
selectedIndexPath = sender.tag 
} 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    if let selectedImage: UIImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
      let cell = self.tableView.cellForRowAtIndexPath(selectedIndexPath) as UITableViewCell 
      cell.imageViewInCell.image = selectedImage 
    } 
    dismiss(animated: true, completion: nil) 
} 
+0

С помощью метода жеста вы можете пройти только объект GestureRecognizer, а не что-то другое. –

+0

Хорошо, позвольте мне изменить это. –

+0

Отредактированный ответ. –