2016-07-31 3 views
2

Ich habe versucht, dies jetzt für eine Weile herauszufinden und nach ein paar Stunden Suche nach einer Lösung entschied ich, dass es Zeit war zu fragen.Segle von UITableViewCell durch Tippen auf ein Bild innerhalb der Zelle

Ich habe eine Tabellenansicht, die von benutzerdefinierten UITableViewCells gefüllt wird und derzeit, wenn Sie auf eine Zelle tippen, führt es Sie zu einer Detailansicht.

Innerhalb der benutzerdefinierten Zelle gibt es ein Bild, ich möchte, dass der Benutzer in der Lage ist, auf das Bild zu tippen und zu einem Popover-VC zu wechseln, das das Bild zeigt.

Worauf ich Probleme habe, ist die Erstellung des Segments, wenn das Bild angetippt wird.

override func awakeFromNib() { 
    super.awakeFromNib() 

    let tap = UITapGestureRecognizer(target: self, action: #selector(PostCell.voteTapped(_:))) 
    let ptap = UITapGestureRecognizer(target: self, action: #selector(PostCell.imageTapped(_:))) 
    tap.numberOfTapsRequired = 1 
    ptap.numberOfTapsRequired = 1 
    voteImage.addGestureRecognizer(tap) 
    voteImage.userInteractionEnabled = true 
    featuredImg.addGestureRecognizer(ptap) 
    featuredImg.userInteractionEnabled = true 


} 

ich auch eine Funktion in der benutzerdefinierten Zelle Datei für:

In der Datei für die benutzerdefinierte Zelle, ich habe eine Anzapfung Gestenerkenner auf das Bild (PTAP) einrichten die Hahn:

func imageTapped(sender: UIGestureRecognizer) { 

    print("image tapped") 


} 

in meiner Ansicht-Controller-Datei habe ich eine segue in gelegt hat, Zeile an dem Indexpfad hinzugefügt:

Auch im Storyboard habe ich einen Übergang von der VC erstellt, der die Tabellenansicht mit den benutzerdefinierten Zellen an die VC hält, die ich zeigen möchte, wenn das Bild angetippt wird.

Ich habe mehrere verschiedene Methoden ausprobiert, um dies zum Funktionieren zu bringen und habe kein Glück gehabt, der Code, den Sie oben sehen, ist, was nach meinen vielen gescheiterten Versuchen bleibt. Ich fühle, dass die Funktion für den Wasserhahn in der benutzerdefinierten Zelle Datei und das Segment in der VC-Datei ein Teil der Lösung sind, deshalb habe ich sie in verlassen.

Jede Hilfe wäre willkommen. Vielen Dank!

Added Protokoll

protocol ImageSegueProtocol: class { 
    func imageTapped(row: Int) 
} 


class PostCell: UITableViewCell { 

Added IAB Func

@IBAction func imageTapped(sender: UIGestureRecognizer) { 
    guard let row = row else { return } 
    delegate?.imageTapped(row) 
    print("image tapped func") 
} 

erklärt Delegierter im Haupt VC

weak var delegate:postCell? 

Assigned Del:

Updates von Antworten unten codieren Tor

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    //let post = posts[indexPath.row] 

    if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell { 

     var img: UIImage? 
     var vImg: UIImage? 
     postCell?.delegate = self 

Added Erweiterungsfunktion

extension FeedVC: ImageSegueProtocol { 

func imageTapped(row: Int) { 
    if inSearchMode == true { 
     let object = filteredVenues[row] 
     performSegueWithIdentifier("imageTapped", sender: object) 
     print("ext func") 
    } else { 
     let object = posts[row] 
     performSegueWithIdentifier("imageTapped", sender: object) 
     print("ext func") 
    } 



} 
+0

Haben Sie einen Delegaten auf dem Tisch Sichtzelle erstellt? –

+0

Hey Ran, nein ich habe nicht – ryanbilak

Antwort

0

Was Sie tun müssen, ist eine Taste anstelle des Bildes zu erstellen und diese Taste wird das aktuelle Bild halten:

enter image description here

Der Rest ist einfach, Strg ziehen Sie eine IBAction in Ihre benutzerdefinierte Zelle. Jetzt müssen Sie mit Ihrem View-Controller kommunizieren, um Ihre Überleitungsmethode aufzurufen.

können Sie erreichen, dass unter Verwendung von 2 Entwurfsmuster:

  1. Mit post notification:

    im View-Controller einen Beobachter hinzu:

    NSNotificationCenter.defaultCenter().addObserver(self, 
              selector: #selector(YourViewController.cellSelected(_:)), 
              name: "CellSelectedNotificationName", 
              object: nil) 
    

    Ihre Methode cellSelected in Ihrem View-Controller sollte wie folgt aussehen:

    func cellSelected(notification : NSNotification) 
    { 
        if let passedObject = notification.object as? YourCustomObject 
        { 
        // Do what ever you need with your passed object 
        // When you're done, you can invoke performeSegue that will call prepareForSegue 
        // When invoking performeSegue you can pass your custom object 
        } 
    } 
    

    In Ihrer CustomCell Klasse an der IBAction Methode Ihrer Taste:

    @IBAction func buttonTapped() 
    { 
        // Prepare the object you want to pass... 
        NSNotificationCenter.defaultCenter().postNotificationName("CellSelectedNotificationName", object: YourCustomObjectYouWantToPass) 
    } 
    

    In einer Nussschale, ein Knopf in einer Zelle abgehört wurde, erstellt man ein Objekt in dieser Zelle und Sie es auf einen Blick übergeben Controller, der das Benachrichtigungscenter verwendet. Jetzt können Sie mit Ihrem benutzerdefinierten Objekt fortfahren.

HINWEIS: Wenn Sie nicht brauchen, um ein Objekt übergeben Sie können im Grunde ctrl + Ziehen von Ihrem UIButton (bei Storyboard) in einem anderen View-Controller.

  1. Verwenden Sie eine delegate, die auf den View Controller zeigt.

Viel Glück.

+0

Danke Ohad, ich werde das ausprobieren. Können Sie mir Informationen über den Delegaten geben, der auf den VC verweisen muss? – ryanbilak

+0

Ich habe Links für jedes Design hinzugefügt, werfen Sie einen Blick auf sie. Wenn Sie es immer noch nicht bekommen, lassen Sie es mich wissen, ich füge ein Beispiel hinzu. – OhadM

+0

Awesome danke, ich werde einen Blick und auf Sie zurück, wenn nötig – ryanbilak

3

Man könnte es wie folgt tun:

Innerhalb der Zelle Datei, ein Protokoll an der Spitze, erklären und dann einige Eigenschaften innerhalb der Zelle Klasse einrichten selbst und die Delegierten Verhalten als Reaktion auf das Bild geklopft werden:

protocol SomeCellProtocol: class { 
    func imageTapped(row: Int) 
} 


class SomeCell: UITableViewCell { 

    weak var delegate: SomeCellProtocol? 
    var row: Int? 

    @IBAction func imageTapped() { 
     guard let row = row else { return } 
     delegate?.imageTapped(row) 
    } 
} 

Sie müssen dann machen Sie Ihren Viewcontroller SomeCellProtocol nehmen und das segue rufen in etwa so:

extension SomeViewController: SomeCellProtocol { 

    func imageTapped(row: Int) { 
     //get object from array and call segue here 
    } 
} 

und Sie müssen Ihre Vie gesetzt wController als Delegierter Ihrer Zellen durch den Aufruf:

someCell.delegate = self 

und die Zeile der Zelle passieren:

someCell.row = indexPath.row 

in Ihrer cellForRowAtIndexPath Methode des Viewcontroller.

So, wenn der Knopf innerhalb der Zelle angetippt wird (oder Sie können es mit einem GestureRecognizer auf dem ImageView tun, wenn Sie wollen), wird es den Delegaten (der ViewController) zwingen, seine imageTapped Funktion aufzurufen und einen Zeilenparameter zu übergeben Sie können verwenden, um zu bestimmen, welches Objekt in der Tabelle (das entsprechende Datenarray) über das Segue übergeben werden soll.

+0

Danke Ross, kannst du mir helfen, das Objekt aus dem Array in der VC-Erweiterung zu bekommen? Brauchen Sie einfach eine Erklärung, was genau Sie meinen – ryanbilak

+0

Grundsätzlich müssen Sie wissen, welches Objekt Sie Details anzeigen möchten. Sie haben die Zeile an die Zelle übergeben, und Sie erhalten die Zeile zurück in der Delegate-Methode. Verwenden Sie also diese Zeile, um das Objekt aus Ihrem Array zu erhalten: let object = filteredVenues [row], wenn Sie sich im Suchmodus befinden lass Objekt = Beiträge [Zeile] wenn nicht! – RossP

+0

Danke würde das so aussehen? 'Verlängerung FeedVC: ImageSegueProtocol { func imageTapped (Reihe: Int) { wenn inSearchMode == true { let Objekt = filteredVenues [Zeile] performSegueWithIdentifier ("imageTapped", Absender: null) } else { let Objekt = Beiträge [Zeile] performSegueWithIdentifier ("imageTapped", Absender: null) } } } 'Und würde der Delegierte sein.' PostCell() Delegat = self' PostCell ist die Datei für meine benutzerdefinierte Zellen – ryanbilak

0

Wie OhadM sagte, erstellen Sie eine Schaltfläche und legen Sie das Hintergrundbild als das Bild fest, das angezeigt werden soll. Von dort brauchen Sie nicht einmal eine IBAction. Ziehen Sie bei gedrückter Strg-Taste von der Schaltfläche zum nächsten View-Controller und erstellen Sie den Abschnitt.

Dann, wenn Sie in der ersten VC jede Einrichtung vor dem Übergang, tun wollen würden Sie so etwas wie haben:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     if segue.identifier == "imageButtonPressed" { // Make sure you name the segue to match 

      let controller = segue.destinationViewController as! SecondVC 
      controller.someText = "Hi" 
      controller.someInt = 5 
     } 
} 
Verwandte Themen