2015-06-01 2 views
5

Ich habe herausgefunden, wie Daten zwischen Ansichten mit Delegaten in anderen Situationen übergeben, aber dieses hier stempelt mich.Delegaten zu verwenden, um Daten aus einer benutzerdefinierten Zelle an ein Label in der übergeordneten Ansicht zu kommunizieren

In diesem Beispiel versuche ich, Daten zu senden, die aus dem Drücken einer Schaltfläche resultieren, bis zu dem Etikett, das ein Delegatenmuster aber ohne Erfolg verwendet. Meine Vermutung ist, dass mir hier etwas Grundlegendes fehlt und ich habe keine Beispiele gefunden, die sich auf diese Weise mit Delegierten befassen.

// 
// ViewController.swift 
// TableCellDelegate 
// 
// Created by Chris Cantley on 6/1/15. 
// Copyright (c) 2015 Chris Cantley. All rights reserved. 
// 

import UIKit 

class ViewController: UIViewController, CellInfoDelegate { 

    var cellViewController = CellViewController() 

    //The place to put the number into. 
    @IBOutlet weak var sumLabel: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     cellViewController.delegate = self 
    } 

    //2)...to here. 

    func processThatNumber(theNumber: Int) { 
     println("out : \(theNumber)") 
    } 
} 


// Table View delegates 
extension ViewController: UITableViewDataSource, UITableViewDelegate 
{ 

    //One row 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 1 
    } 

    // Load custom cell 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("thisCustomCell", forIndexPath: indexPath) as! CellViewController 
     return cell 
    } 

} 


//-------------------- Protocol for Delegate ----------------------- 

protocol CellInfoDelegate { 
    func processThatNumber(theNumber: Int) 
} 



//-------------------- Cell to Pass info to Parent ----------------------- 

class CellViewController: UITableViewCell{ 

    var sumNumber: Int = 0 
    var delegate: CellInfoDelegate? 


    @IBAction func addButton(sender: AnyObject) { 

     // increment that number 
     self.sumNumber += 5 

     //1) I want to get it from here...... but delegate ends up nil 
     if let delegate = self.delegate { 
      delegate.processThatNumber(self.sumNumber) 
     } 


     //Shows that the number is incrementing 
     println(sumNumber) 

    } 
} 

enter image description here

Der Viewcontroller und CellViewController sind

ihren jeweiligen Klassen verbunden

Vielen Dank im Voraus.

Antwort

12

Sie sollten die Delegierten hier eingestellt:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("thisCustomCell", forIndexPath: indexPath) as! CellViewController 
    cell.delegate = self // <-- Set the delegate. 
    return cell 
    } 
+0

DANKE! Wenn ich die Argumentation richtig verstehe, liegt es daran, dass hier die Zelle instanziiert wird und dadurch für jede Zelle eine Verbindung zum Elternteil hergestellt wird? –

+0

Das ist richtig. –

+0

Das verbindet meine Verständnislücke für Delegierte. Danke noch einmal. –

0

Haben Sie Delegierten verwenden?

Was passiert, wenn Sie diese Funktion Ausgang eine Nummer haben:

func processThatNumber(theNumber: Int) -> Int { 
    println("out : \(theNumber)") 
    return theNumber 
} 

dann den Text auf dem Etikett setzen mit der Taste:

@IBAction func addButton(sender: AnyObject) { 
    self.sumNumber += 5 
    sumLabel.text = "\(processThatNumber(self.sumNumber))" 
    println(sumNumber) 
} 

Würde das für Sie?

+0

zu sortieren Der Kern des Problems ist, dass die ViewController-Klasse unterscheidet sich von der CellViewController-Klasse. Das Übergeben von Daten an den CellViewController ist kein Problem, aber etwas davon zu sichern, scheint einen Delegaten zu erfordern, da ich die Schaltfläche nirgends anhängen kann, außer der Klasse, mit der sie verbunden ist. Da es sich um eine benutzerdefinierte Zelle handelt, ist eine separate Klasse der einfachste Weg, um die Aktionen und spezifischen Funktionen darin zu verwalten. Wenn ich jedoch falsch liege oder es einen einfacheren Weg gibt, bin ich offen für Lösungen. –

6

Dank i_am_jorf für die Lösung, hier ist der Code, der funktioniert.

// 
// ViewController.swift 
// TableCellDelegate 
// 
// Created by Chris Cantley on 6/1/15. 
// Copyright (c) 2015 Chris Cantley. All rights reserved. 
// 

import UIKit 
import Foundation 

class ViewController: UIViewController, CellInfoDelegate { 

    //The place to put the number into. 
    @IBOutlet weak var sumLabel: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    //2)...to here. 

    func processThatNumber(theNumber: Int) { 
     println("out : \(theNumber)") 
     self.sumLabel.text = toString(theNumber) as String 
    } 
} 


// Table View delegates 
extension ViewController: UITableViewDataSource, UITableViewDelegate 
{ 

    //One row 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 1 
    } 

    // Load custom cell 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("thisCustomCell", forIndexPath: indexPath) as! CellViewController 

     //SOLUTION : put the Delgate HERE in the place where the cell is instantiated so that there is a connection back 
     // to this class from the Cell class 
     cell.delegate = self 

     return cell 
    } 

} 


//-------------------- Protocol for Delegate ----------------------- 

protocol CellInfoDelegate { 
    func processThatNumber(theNumber: Int) 
} 



//-------------------- Cell to Pass info to Parent ----------------------- 

class CellViewController: UITableViewCell{ 

    var sumNumber: Int = 0 
    var delegate: CellInfoDelegate? 


    @IBAction func addButton(sender: AnyObject) { 

     // increment that number 
     self.sumNumber += 5 

     //1) I want to get it from here...... but delegate ends up nil 
     if let delegate = self.delegate { 
      delegate.processThatNumber(self.sumNumber) 
     } 


     //Shows that the number is incrementing 
     println(sumNumber) 

    } 
} 
+1

Das ist ehrlich gesagt das Größte, was ich jemals auf SO gefunden habe ... –