UITableView Problem - sehr strange!

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

  • UITableView Problem - sehr strange!

    Hallo zusammen

    Ich habe in einer anderen Applikation (Windows Based) eine Table Klasse erstellt. Nun habe ich diese in eine neue App portiert, welche nun View based ist. Dort stürzt mir die die App sofort ab, sobald mit der Tabelle interagiert wird.


    2010-09-25 18:22:37.129 TestwithTables[42928:40b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString tableView:cellForRowAtIndexPath:]: unrecognized selector sent to instance 0x6a1e770'

    Witzigerweise mit einem unrecognized selector. Gemäss den beiden Protokollen UITableViewDelegate und UITableViewDataSource sind die nötigen Methoden implementiert.

    Ich habe nun eine neue App gebaut, um den Fehler zu reproduzieren. Und auch da taucht er auf. Also MUSS ich wohl irgendwas falscht gemacht haben ;) Hinweise herzlichst willkommen. Im Attachment das einfache abgespeckte Projekt.
    Coding: code.zero-one.ch

    Personal
    =======
    WWW: spychernet.com
    Twitter: twitter.com/omnibyte
  • Der MyTableController wird zwar im MainViewController beim Laden des MainView.xib erzeugt, erhält jedoch nirgends ein retain. Dadurch wird das MyTableController Objekt beim leeren des Autorelease Pool natürlich wieder freigegeben. Die beiden Delegates des TableViews zeigen somit auf ein nicht mehr vorhandenes Objekt. Anscheinend wird dieser Speicherbereich dann mit einem NSString Objekt neu belegt, so dass bei dem String Objekt versucht wird die Methode tableView:cellForRowAtIndexPath: aufzurufen.

    Um das Freigeben des MyTableController Objektes zu verhindern, musst Du im MainViewController ein retain IBOutlet auf den MyTableController definieren und im MainView.xib dieses Outlet mit dem MyTableController verbinden. Im viewDidUnload von MainViewController natürlich self.tableController = nil; nicht vergessen!

    BTW: Warum verwendest Du überhaupt einen eigenen TableViewController innerhalb des MainViewControllers?
  • Ach du liebes Lieschen... War effektiv der naiven Meinung, dass Memory Management einem erst bei komplexen Projekten in den Hintern beissen kann. (bin relativ neu in der C Welt) Ich gehe deinem, sehr schön formulierten, Hinweis gleich nach... Ich glaube diese Thematik ist effektiv einen Blog Beitrag von meiner Seite her wert.
    *kopfschüttel* auf diese Lösung währe ich, glaube ich, lang bis nie gekommen...
    Coding: code.zero-one.ch

    Personal
    =======
    WWW: spychernet.com
    Twitter: twitter.com/omnibyte
  • @MCDan HERZLICHEN DANK!!! Hat hervorragen funktioniert. Umso mehr ich über diesen Sachverhalt nachdenke, umso mehr wird es mir klarer!

    Ich bin viel im Internet unterwegs. Auch viel in Foren. Aber die Qualität dieses Forums ist aussergewöhnlich! Thanks for Help!

    Zu deiner Frage:
    >> BTW: Warum verwendest Du überhaupt einen eigenen TableViewController innerhalb des MainViewControllers?
    Meine Applikation hat eine, für meine Verhältnisse noch, komplexe TableView. Diese hat diverse interaktionsmöglichkeiten. Und auch gemäss Apple Referenz Doku ist dies ein guter Weg meine Requirements zu lösen. Dies funktioniert soweit auch ganz gut.
    Coding: code.zero-one.ch

    Personal
    =======
    WWW: spychernet.com
    Twitter: twitter.com/omnibyte
  • Du solltest jedoch darüber nachdenken, den TableView aus dem TableViewController zu verwenden und nicht den TableViewController als Delegate/DataSource für einen "externen" TableView zu verwenden.

    Wenn Du, in der aktuellen Konstellation, innerhalb des TableViewControllers auf den TableView zugreifen möchtest, dann wird dies nicht gelingen, da Du im TableViewController keine Referenz auf den "externen" TableView hast, sondern nur der "eigene" TableView aus dem TableViewController referenziert ist.

    Im MainViewController kannst Du z.B. in der viewDidLoad Methode den TableView aus dem TableViewController per [self.view addSubview:self.tableViewController.view] zum View des MainViewController hinzufügen. Per self.tableViewController.view.frame musst Du natürlich noch die Größe und Position des TableViews entsprechend setzen.
  • Oukay, das ist äusserst interessant! In der tat konnte ich grundsätzlich nicht auf die Tableview zugreifen. Jedoch, habe ich ein IBOutlet erstellt im Controller und dies mit der Tableview verbunden. Witzigerweise findet XCode, die Methoden meiner Tableview seien nicht da, aber ich diese Meldungen ignoriere und einfach alles hin schreibe wie es sein sollte funktioniert es trotzdem.
    Aber ich werde deinem Hinweis folgen und dies entsprechend umbauen.

    Grüüse us dr Schwiitz
    Coding: code.zero-one.ch

    Personal
    =======
    WWW: spychernet.com
    Twitter: twitter.com/omnibyte