2017-11-02 2 views
0

Ich habe ein Social Network Feed in Form UItableView, die eine Zelle hat. Jetzt hat jede Zelle ein Bild, das animiert wird, wenn eine Gerade ausgelöst wird. Nun, Dieses Ereignis hat die Form einer Zeichenfolge, die bei jeder Zelle ausgelöst wird. Die Optionen für das Ereignis sind in einer anderen Klasse (vom Typ NSObject) definiert.Delegate-Methode zu UItableViewCell Swift

Mein Problem: Ich baute eine Protokolldelegiertenmethode in der Tabellenansicht, die jedes Mal aufgerufen wird, wenn das Ereignis für jede Zelle ausgelöst wird. Dann definiere ich diese Funktion in der UITableViewCell Klasse, da mein Bild darauf animiert wird. Alles funktioniert gut, aber ich bin nicht in der Lage, den Delegaten der TableView-Klasse der Zellklasse zuzuordnen. Was ich meine ist, wie kann ich UITableView.delegate = self in CellView Klasse verwenden. Ich habe versucht, eine statische Variable zu verwenden, aber es funktioniert nicht.

Ich habe schon eine Weile mit den Protokollen gespielt, aber wirklich keine Lösung gefunden.

Ich hoffe, ich bin klar. Wenn nicht, werde ich mit einem Beispiel in den Kommentaren angeben. Es tut mir leid, Dies ist ein vertrauliches Projekt und ich kann nicht alle Details preisgeben.

Antwort

1

Wenn ich deine Frage richtig verstanden, vielleicht könnte dies helfen:

class ViewController: UIViewController, YourCustomTableDelegate { 

@IBOutlet weak var tableView: YourCustomTableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.tableView.customTableDelegate = self 
    } 


    // table delegate method 
    func shouldAnimateCell(at indexPath: IndexPath) { 
     if let cell = tableView.cellForRow(at: indexPath) { 
      cell.animate(...) 
     }  
    } 
} 
+0

Hey, TBH diese di hat mein Problem nicht genau gelöst. Aber ich habe eine ähnliche Lösung gefunden, indem ich Hinweise aus Ihrer Antwort genommen habe. Was ich eigentlich gemacht habe, ist das Aufrufen mehrerer Funktionen in 'scrollViewDidEndDragging', die selbst noch andere Funktionen hatten, für die ich schließlich einen Delegierten benötigt habe. Ich habe gerade die Zellen der benutzerdefinierten UITableView-Klassen an die Funktion übergeben. Es hat gut funktioniert. Ich hatte die gleiche Logik, ich habe es einfach übersehen. Prost Kumpel für die schnelle Hilfe. –

0

so etwas wie dieses Versuchen:

Definieren Sie Ihre Delegierten Protokoll:

protocol CustomCellDelegate: class { 
    func animationStarted() 
    func animationFinished() 
} 

Definieren Sie Ihre CustomCell. Extrem wichtig, um eine schwache Delegiertenreferenz zu definieren, damit Ihre Klassen sich nicht gegenseitig erhalten.

class CustomCell: UITableViewCell { 
    // Don't unwrap in case the cell is enqueued! 
    weak var delegate: CustomCellDelegate? 

    /* Some initialization of the cell */ 

    func performAnimation() { 
     delegate?.animationStarted() 
     UIView.animate(withDuration: 0.5, animations: { 
      /* Do some cool animation */ 
     }) { finished in 
      self.delegate?.animationFinished() 
     } 
    } 
} 

Definieren Sie Ihren Ansichtscontroller. Delegierten innerhalb tableView:cellForRowAt zuweisen.

1

Wenn ich Sie richtig verstehe, versuchen Sie, jede Ihrer Zellen mit einem Protokoll konform zu machen, das zu ihrem UITableView gehört? Wenn dies der Fall ist, kann dies nicht getan werden. Das Delegationsentwurfsmuster ist eine Eins-zu-eins-Beziehung, d. H. Nur eine Ihrer UITableViewCells kann dem Delegaten von UITableView entsprechen.

Delegierung ist ein einfaches und leistungsfähiges Muster, in dem ein Objekt in einem Programm im Auftrag oder in Koordination mit einem anderen Objekt agiert. Das delegierende Objekt behält eine Referenz auf das andere Objekt - den Delegaten - und sendet ihm zu gegebener Zeit eine Nachricht. Die Nachricht informiert den Delegaten über ein Ereignis, das das delegierende Objekt behandeln wird oder gerade bearbeitet wurde. Der Delegat kann auf die Nachricht reagieren, indem er das Erscheinungsbild oder den Status von sich selbst oder anderen Objekten in der Anwendung aktualisiert, und in einigen Fällen kann er einen Wert zurückgeben, der beeinflusst, wie ein bevorstehendes Ereignis behandelt wird. Der Hauptwert der Delegierung besteht darin, dass Sie das Verhalten mehrerer Objekte in einem zentralen Objekt problemlos anpassen können.

Zitat aus dem Apple Docs

würde ich vorschlagen, dass Ihr UITableViewCell einen Block (Objective-C) nennen sollte oder einen Verschluss (Swift), wenn Ihr angegebenes Ereignis ausgelöst wird, zu erreichen, was Sie suchen. Richten Sie diese Schließung in Ihrer Funktion tableView: cellForRowAtIndexPath ein.

Beispiel

Tableviewcontroller

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyTableViewCellID", for: indexPath) as! MyTableViewCell 
    cell.eventClosure = { 
    //Do something once the event has been triggered. 
    } 
    return cell 
    } 

TableViewCell

func eventTriggered() 
{ 
    //Call the closure now we have a triggered event. 
    eventClosure() 
} 
+1

Das war sehr nachdenklich. Es war nicht etwas, das ich nach dieser Option suchte, aber es half mir sicherlich bei anderen Problemen in meinem Projekt. Prost Kumpel! –

+1

@AakashDave Kein Problem! Froh, dass Sie eine Lösung gefunden –

+0

Ich bin mit einem ähnlichen Problem der Weitergabe von Daten konfrontiert. Würde es wirklich schätzen, wenn du es dir anschaust und hilfst. –

Verwandte Themen