2016-11-30 29 views
1

Ich versuche, eine Rezept-App mit einer Rezept-Upload-Funktion zu bauen. Im PostController gibt es eine Tischansicht aller Kochschritte, jeweils in einer Tabellenansichtszelle. In der Zelle gibt es ein Textfeld der Beschreibung und ein UIImageView für Bild-Upload (das Bild von PickerController ausgewählt wird in diesem UIImageView für den späteren Upload angezeigt werden). Ich versuche imageViewInCell.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageUpload))) zu tun, um die handleImageUpload() Funktion aufzurufen, die einen UIImagePickerController generiert. Aber damit habe ich zwei Probleme gelöst.Mit UIImagePickerController in jeder Tabellenansicht Zelle

  1. kann ich nicht erhalte den index.row Wert der Zelle durch den Selektor in UITapGestureRecognizer, mit aus dem Index I kann nicht das ausgewählte Bild auf die UIImageView der Zelle zuweisen zurück.
  2. Auch wenn ich index.row in handleImageUpload habe, brauche ich noch die Funktion unten, um das ausgewählte Bild zuzuweisen. Wie würde diese Funktion meinen Parameter akzeptieren und die entsprechende imageViewInCell finden?

    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

Warum wird anstelle von didSelectRowAtIndexPath eine Tippgeste verwendet? –

+0

Ich habe UITapGesture für die imageView hinzugefügt, weil diese Operation einfach nur auf das Bild bezogen ist. Die Verwendung von didSelectRowAtIndexPath ist möglicherweise nicht die richtige Wahl, da sich in der Zelle auch ein Textfeld befindet. –

+0

Schließlich habe ich den Index sowohl mit der globalen Variable 'selectedIndex' (verwendet von' didFinishPickingMediaWithInfo') als auch mit 'cell.imageViewInCell.tag' (verwendet von' handleImageUpload() ') gespeichert, jedesmal wenn' handleImageUpload() 'aufgerufen wird, Sie weisen 'selectedIndex' dem Wert' cell.imageViewInCell.tag' zu. In 'didFinishPickingMediaWithInfo' wird die globale Variable benötigt, um die entsprechende Zelle zu finden. –

Antwort

1

Sie die indexPath.row als Tag des Imageview in cellForRowAtIndexPath wie Below

cell.yourImageView.tag = indexPath.row 

und dann können Sie diese indepath erhalten Backagain mit unter

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

Diese Idee hilft. Das Problem wurde jetzt gelöst, Danke! –

+0

willkommen happy coding .... –

0
einstellen

Ich nehme an, Sie wollen thehandleImageUpload() nur am Tippen auf imageView anstelle der ganzen Zelle aufgerufen werden Daher verwenden Sie tapGesture.

nun Ihre Frage zu beantworten, weisen Tag zu Ihrem Imageview wie folgt aus:

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

Und Sie können so zu ausgewählten Zelle ausgewählte Bild zuordnen:

Jetzt ist Ihre handleImageUpload() ist:

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

Mit Gesten-Methode können Sie nur GestureRecognizer-Objekt nicht etwas anderes übergeben. –

+0

Okay, lass mich das bearbeiten. –

+0

Bearbeitete Antwort. –

Verwandte Themen