Container View mit Table View

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Container View mit Table View

    Hallo Leute,

    ich kriegs nicht hin: Eine Seite enthält ein Textfeld und einen Button, darunter habe ich eine Containerview mit (embed segue) verbundenem TableViewController.
    Das Ziel ist der Benutzer gibt oben etwas ein, drückt den Button und dann wird ohne Navigation nach vor oder zurück die eben erwähnte Tabelle mit dem Inhalt des Textfelds erweitert, wächst also.

    Das ganze sieht im Storyboard so aus, siehe Anhang

    Die Klickfunktion des Buttons sieht so aus:



    QuellcodeQuellcode bearbeiten


    [*]@IBAction func doAddEssen(_ sender: Any) {
    [*] ev.addEssenAuswahl(EssenIndex: meinEssenID)
    [*] meinEssenMenge.doneClicked()
    [*] }
    [/list]


    Der View Controller Essen Liste ist eine CocoaTouch Klasse mit den bekannten Stubfunktionen ... cellForRowAt.... usw.
    Ich bekomme das aber ueber die Container View nicht richtig eingebunden. Gebe ich was ein, lädt die Tabelle nicht sofort nach. Gehe ich aber "Zurück" und dann wieder auf diese Seite, zeigt die Tabelle die bisher eigebenen Daten an.
    Dateien
  • Ach so, die TableView befindet sich in einem eigenem ViewController, richtig?

    Da gibt es jetzt viele Möglichkeiten:

    1. Du kannst das Outlet auf die TableView in dem View Controller Essen Liste Public definieren. Dann kannst Du von ausserhalb das reloadData() aufrufen.
    2. Du definierst in dem View Controller Essen Liste eine Public Methode, welche dann einfach ein reloadData() bei dem TableView aufruft.
    3. Du verwendest Notifications, wenn sich Dein Datenmodel ändert und aktualisierst bei einer Änderung per reloadData() die TableView.
    4. Du verwendest Key-Value Observing (KVO), um über Änderungen an dem Datenmodel informiert zu werden und daraufhin dann per reloadData() die TableView zu aktualisieren.
  • Ne, ich bekomms nicht hin. Intuitiv ist das ganze für meine Begriffe nicht. Weil sämtliche Beispiele davon ausgehen, dass die Tableview nach Eingabe auf View1 per Segue in View2 aktualisiert werden. Dann wieder zurück und vorwärts, ja das klappt auch prima.

    Methode1:
    Das sieht also wie folgt aus?

    Quellcode

    1. class ViewControllerEssenListe: UITableViewController {
    2. @IBOutlet public var tableViewEssenListe: UITableView!

    Aber im ViewControllerEssenEingabe kan ich das dann auch nicht benutzen. Und rüberziehen im Storyboard geht ja nicht.

    Methode2:
    So?

    Quellcode

    1. class ViewControllerEssenListe: UITableViewController {
    2. @IBOutlet public var tableViewEssenListe: UITableView!
    3. public func reloadTableData() {
    4. tableViewEssenListe.reloadData()
    5. }

    In der Methode doAddEssen in ViewControllerEssenEingabe kann ich dort aber nicht auf die public Methode verweisen, gelingt mir nicht. Ist wahrscheinlich anders gemeint. Die Frage ist, wie bekomme ich überhaupt eine Referenz auf ein runtime-instanziertes Objekt?
    Xcode bietet zwar überall die Klassendefinition an UND übersetzt das auch. Aber das scheitert dann spätestens während der Laufzeit.

    Methode 3&4:
    Also um das zu verstehen benötigt man nach meiner EInschätzung ein paar Tage Einarbeitung wie das implementiert werden soll. Der Grundgedanke ist mir schon klar, und es wäre schön wenn es out of the Box funktionieren würde. Viele Beispiele dazu sind aber noch in Objective-C gehalten, das nutzt mir dann wenig. Und ist für die kleine Lösung hier wahrscheinlich Kanonen auf Spatzen.

    Ist das wirklich so schwierig zu lösen, Button-Click in VC1 aktualisert über COntainer View VC2 mit eingebetteter TableView?
  • Mir ist nicht wirklich klar, warum Du überhaupt einen eigenen ViewController für die TableView verwendest, aber egal.

    Im Interface Builder solltest Du eigentlich ein IBOutlet in dem ViewControllerEssenEingabe auf den ViewControllerEssenListe verwenden können. Somit hast Du dann in der Methode doAddEssen eine Referenz auf den ViewControllerEssenListe und kannst die definierte Public Methode aufrufen.

    Ups, bei dem Punkt Key-Value Observing (KVO) wollte ich eigentlich noch einen Link auf dem Artikel Using Key-Value Observing in Swift setzen. ;)
  • Ne, das geht bei mir nicht. Ctrl-Drag von der gelben Ecke ViewControllerEssenListe in den Source (egal wo hin im File) ViewControlleEssenEingabe zeigt zwar die blaue Linie, aber das Outlest lässt sich nicht festmachen.
    Der eigene ViewController als Parent der TableView lässt doch überhaupt erst progarmmatisch zu, z.B. mit Protype-Zellen auf die Handbuch-Weise zu arbeiten (numberOfSections, cellForRowAt) usw.

    Wie lässt sich denn so was alternativ bewerkstelligen?
  • Okay, ich hatte jetzt noch mal Zeit das ganze grundsätzlich zu probieren, für alle Xcode/Swift Anfänger zum Thema "Button drücken und Update einer Tabelle auf derselben Page" (ohne Container View)

    Quellcode

    1. class ViewController: UIViewController, UITableViewDataSource {
    2. @IBOutlet weak var tv: UITableView!
    3. @IBOutlet weak var b: UIButton!
    4. var dataCount: [Int] = []
    5. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    6. return dataCount.count
    7. }
    8. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    9. let cell = tableView.dequeueReusableCell(withIdentifier: "myCell")! //1.
    10. let text = dataCount[indexPath.row] //2.
    11. cell.textLabel?.text = String(text) //3.
    12. return cell
    13. }
    14. @IBAction func doClick(_ sender: Any) {
    15. dataCount.append(Int(NSDate().timeIntervalSince1970))
    16. tv.reloadData()
    17. }
    18. override func viewDidLoad() {
    19. super.viewDidLoad()
    20. // Do any additional setup after loading the view.
    21. tv.dataSource = self
    22. }
    Alles anzeigen
    Dateien