2017-06-16 3 views
0

Ich habe ein Problem mit xcode, seit ich auf 8.3.3 aktualisiert habe. Ich arbeite normalerweise mit der MCV (Model - View - Controller) -Methode, und jetzt werden meine Variablen nicht zwischen ihnen aktualisiert.Xcode 8.3.3 Swift 3 - Variable wird nicht zwischen Dateien aktualisiert

Situation: Ich habe ein Modell (speichern Sie alle wichtigen Variablen und Berechnungen Funktionen); ein TableView Controller (Control Tableview) und TableViewCell (Set Outlet und Aktionen)

Ziel: Wenn eine Schaltfläche in einer Zelle gedrückt wird, sollte eine Zeile in TableView hinzugefügt werden.

Problem: Warum erhält die Tabellenansicht nicht den neuen Wert der Model() - Variable.

Um es besser zu machen, hier zu verstehen, eine Zeitleiste ist, was los ist:

Run> viewDidLoad in Tableviewcontroller> aktualisieren Variable Test in Modell() laufen> cellForRowAt aufgerufen und druckt [ "1"] > zeige tableView mit 1 Zeile> drücke die Taste> drucke ["1"]> füge ["2"] zu Model() hinzu> print ["1", "2"]> post notification> viewDidLoad erhält Notification und druckt "reloading table "> cellForRowAt wird aufgerufen und druckt [" 1 "]> tableView behält 1 Zeile. Hier

ist ein Beispiel für meinen Code:

Ich habe meine Model.Swift:

class Model { 
    var test : [String] = [] 
} 

Mein Tableviewcontroller:

class BudgetTableViewController: UITableViewController { 

let model = Model() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    model.test.append("1") 
    center.addObserver(forName: NSNotification.Name(rawValue: "reloadTableVIew"), object: appDelegate, queue: queue) {[unowned self] (_) in 
      print("reloading table") 
      self.tableView.reloadData() 
    } 
} 

zu vereinfachen .. in den Abschnitten I immer wiederkommen " 1 "und für Zeilen zähle ich den Variablentest in Model().

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    print(model.test) // **ALWAYS PRINT ["1"]** 
    let cell = tableView.dequeueReusableCell(withIdentifier: "buttonCell", for: indexPath) as! TableViewCell 
    return Cell 
} 

Und mein TableViewCell:

class TableViewCell: UITableViewCell{ 
    let model = BudgetModel() 
    let notification = Notification(name: Notification.Name(rawValue: "reloadTableVIew"), object: appDelegate) 

    @IBAction func okButton(_ sender: UIButton) { 
    print(model.test) 
    model.test.append("2") 
    print(model.test) 
    NotificationCenter.default.post(notification) 
    } 
} 

Ich hoffe, es ist klar genug. Der Punkt ist, wenn ich den Knopf 5 Mal drücke, wird es die Zeichenfolge 5 mal zum Array hinzufügen (das wird im Ausdruck bestätigt) aber wenn cellForRowAt aufgerufen wird, wird es immer ["1"] drucken.

Vielen Dank für Ihre Hilfe

Antwort

2

Die beiden Modelle Vars in verschiedenen Klassen sind. Sie haben Var-Modell in Ihrem ViewController, & Var-Modell in Ihrer Zelle. Das Ändern eines wird sich nicht auf das andere auswirken. Sie wäre am besten, einen Delegierten für Ihre Zellen zu implementieren, wobei die Viewcontroller der Delegat ist, und die Zelle nennt sie, wenn sie gedrückt -

protocol MyCellDelegate: class { 
    func cellWasPressed() 
} 

In der Zelle -

weak var delegate: MyCellDelegate? 

Sie hier die viewController beim Erstellen der Zelle.

dann in die Taste gedrückt Methode, fügen -

self.delegate?.cellWasPressed() 

Im Viewcontroller, implementieren diese -

func cellWasPressed() { 
    self.model.test.append("2") 
    self.tableView.reloadData() 
} 

Ich glaube nicht, müssen Sie eine Benachrichtigung zu verwenden, ist dies weit einfacher.

+0

Vielen Dank! Das hat perfekt funktioniert! Ich suchte nach einer Möglichkeit, Benachrichtigungen zu vermeiden! Das passt richtig! –

Verwandte Themen