Probleme beim übergeben eines Array an ein UITableViewController

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

  • Probleme beim übergeben eines Array an ein UITableViewController

    Hallo zusammen,

    für euch ist das "Problem" bestimmt ziemlich leicht... :)

    Ich parse in meinem UINavigationController eine XML Datei zu einem Array.
    Jetzt möchte ich in diesem UINavigationController einen UITableViewController anzeigen mit dem Inhalt des Arrays.


    Das übergeben funktioniert auch schon... doch die Tabelle wird nicht aktualisiert bzw. cellForRowAtIndexPath wird nicht nochmals aufgerufen.


    Ich schicke mal meinen Code der es vll. etwas besser erklärt:
    Hier rufe ich den UITableViewController auf und übergeben das Array tableInfoArrayLevel1:


    Quellcode

    1. TableViewLevel1 *nextController = [[TableViewLevel1 alloc] initWithItem:tableInfoArrayLevel1];
    2. [self.navigationController pushViewController:nextController animated:YES];
    3. nextController.tableInfoLevel1 = [NSArray arrayWithArray:tableInfoArrayLevel1];
    4. [nextController release];


    Hier versuche ich das Array in tableInfoLevel1 zu kopieren.

    Quellcode

    1. .h@interface TableViewLevel1 : UITableViewController {
    2. CGSize cellSize;
    3. NSArray * tableInfoLevel1;
    4. }
    5. @property (retain, nonatomic) NSArray *tableInfoLevel1;
    6. - (id)initWithItem:(NSArray *)theItem;
    7. .m- (id)initWithItem:(NSMutableArray *)theItem {
    8. tableInfoLevel1 = [[NSArray alloc] init];
    9. if (self = [super initWithNibName:@"TableViewLevel1" bundle:nil]) {
    10. self.tableInfoLevel1 = theItem;
    11. [self.tableView reloadData];
    12. }
    13. return self;
    14. }
    Alles anzeigen



    Wäre super, wenn mir dabei jemand helfen könnte.
    Danke
  • Hi,

    das reloadData dort ist zu früh. Wenn Du das Tableview öfter mit verschiedenen (geänderten) Arrayinhalten benutzen willst, dann must Du das reloadData ins viewWillAppear() packen. Allerdings solte das Tableview auch ohne ein reloadData zumindest beim ersten Öffnen das Array anzeigen.

    Hast Du denn das Delegate und den DataSource für das Tableview richtig gesetzt ?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Hi,

    danke für die schnelle Antwort...

    ich lade die Daten erste beim klicken auf einen BarButton.

    Den Delegate und die DataSource sind beide im InterfaceBuilder auf mein TableView gesetzt.

    Quellcode

    1. - (void)viewWillAppear:(BOOL)animated {
    2. [self.tableView reloadData];
    3. }


    lädt die Daten leider auch nicht...

    Noch eine Idee??
  • oohh da hatte ich etwas rumgespielt... hatte aber auch alles schon mit NSMutableArray probiert.... trotzdem leider nix

    Ich fasse nochmal meinen letzten Kenntnisstand zusammen:

    - das übergeben des NSArray bzw. NSMutableArray funktioniert

    - Auch das numberOfRowsInSection zählt die richtige Anzahl an items im Array(und die sind auch beim ersten laden = 0 und beim drücken des Buttons = 2)

    - Mein Array behält den Wert, bis ich auf meinen Button drücke den ich im UINavigationController deklariert habe

    Benötige ich eigentlich einen IBOutlet UITableView??

    Vielen Dank schon mal
  • Hallo,


    also ich habe mal viel rumgespielt und das was mir eigentlich nur noch fehlt ist das er cellForRowAtIndexPath mehrmals durch geht...
    Macht er aber aus ein mir nicht bekannten Grund nicht???


    Hat keiner mehr eine Idee??
    Soll ich mal das Projekt posten??... bin echt am verzweifeln...
  • Das ist echt nett, wenn ihr mal einen Blick drüber werfen würdet...

    Hab jetzt auch schon 2Tage alles probiert...
    ich streiche mal das xml-parsing und das HTTP-get raus...


    Die Datei NavigationController.h

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. @protocol NSXMLParserDelegate;
    3. @interface NavigationController : UINavigationController<NSXMLParserDelegate> {
    4. UIActivityIndicatorView * activityIndicator;
    5. UIBarButtonItem * aktualisierenButton;
    6. NSURLConnection *connection;
    7. //---Variable for XML---
    8. //---web service access---
    9. //---xml parsing---
    10. }
    11. - (IBAction)aktualisierenAction:(id)sender;
    12. @end
    Alles anzeigen




    Die Datei Die Datei NavigationController.m

    Quellcode

    1. #import "NavigationController.h"
    2. #import "TableViewLevel1.h"
    3. @implementation NavigationController
    4. //@synthesize InfoTableView = _tableView;
    5. @synthesize modulName = _modulName;
    6. @synthesize activityIndicator = _activityIndicator;
    7. @synthesize aktualisierenButton = _aktualisierenButton;
    8. #pragma mark * UI Actions
    9. - (IBAction)aktualisierenAction:(id)sender
    10. {
    11. #pragma unused(sender)
    12. //XML Parsing startet
    13. }
    14. - (void)parserDidEndDocument:(NSXMLParser *)parser {
    15. [activityIndicator stopAnimating];
    16. NSLog(@"all done!");
    17. NSLog(@"stories array has %d items", [tableInfoArrayLevel1 count]);
    18. TableViewLevel1 *nextController= [[TableViewLevel1 alloc] init];
    19. [self.navigationController pushViewController:nextController animated:YES];
    20. [nextController receivedItems:tableInfoArrayLevel1];
    21. [nextController release];
    22. }
    Alles anzeigen



    So jetzt kommen denke ich mal die wichtigsten Dateien...

    TableViewLevel1.h

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. @interface TableViewLevel1 : UITableViewController <UITableViewDelegate, UITableViewDataSource>
    3. {
    4. IBOutlet UITableView * InfoTableView;
    5. CGSize cellSize;
    6. NSMutableArray * tableInfoLevel1;
    7. }
    8. @property (retain, nonatomic) NSMutableArray *tableInfoLevel1;
    9. - (id)initWithItem:(NSMutableArray *)theItem withDelegate:(id)aDelegate;
    10. @end
    Alles anzeigen



    TableViewLevel1.m

    Quellcode

    1. #import "TableViewLevel1.h"
    2. @implementation TableViewLevel1
    3. @synthesize tableInfoLevel1;
    4. - (void)receivedItems:(NSMutableArray *)theItems {;
    5. tableInfoLevel1 = theItems;
    6. [self.tableView reloadData];
    7. }
    8. /*
    9. - (id)initWithItem:(NSMutableArray *)theItem {
    10. //if (self = [super initWithNibName:@"TableViewLevel1" bundle:nil]) {
    11. //[tableInfoLevel1 insertObject:[NSMutableArray arrayWithObjects:@"", nil] atIndex:0];
    12. //tableInfoLevel1 = [NSArray arrayWithArray:theItem];
    13. self.tableInfoLevel1 = theItem;
    14. //self.tableInfoLevel1 = theItem;
    15. //self.title = [tableInfoLevel1 objectForKey:@"Body"];
    16. //}
    17. return self;
    18. }
    19. */
    20. #pragma mark * TableView Methoden
    21. - (NSInteger)numberOfSectionsInTableView:(UITableView *)InfoTableView {
    22. return 1;
    23. }
    24. - (NSInteger)tableView:(UITableView *)InfoTableView numberOfRowsInSection:(NSInteger)section {
    25. return [tableInfoLevel1 count];
    26. }
    27. - (UITableViewCell *)InfoTableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    28. static NSString *MyIdentifier = @"MyIdentifier";
    29. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    30. if (cell == nil) {
    31. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:MyIdentifier] autorelease];
    32. }
    33. // Set up the cell
    34. cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; //Setzt in der Tabelle die Pfeile nach Rechts
    35. int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
    36. [cell setText:[[tableInfoLevel1 objectAtIndex: storyIndex] objectForKey: @"Body"]];
    37. return cell;
    38. }
    39. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    40. // Navigation logic may go here. Create and push another view controller.
    41. /*
    42. <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
    43. // ...
    44. // Pass the selected object to the new view controller.
    45. [self.navigationController pushViewController:detailViewController animated:YES];
    46. [detailViewController release];
    47. */
    48. }
    49. /*
    50. // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    51. - (void)viewDidLoad {
    52. [super viewDidLoad];
    53. //tableInfoLevel1 = [[NSArray alloc] initWithObjects:@"iPhone",@"iPod",@"MacBook",@"MacBook Pro",nil];
    54. }
    55. */
    56. - (void)dealloc {
    57. [super dealloc];
    58. }
    59. @end
    Alles anzeigen



    Problem ist wie gesagt es wird nicht das NumberOfRowsInSection geladen...


    Vielen DANK schonmal...
  • Ich denke, dass das OK ist, denn die Property "topViewController" retain-ed den mittels pushViewController: übergebenen Wert. Das ist auch systematisch richtig, denn mit Zeigen des ViewControllers wird der Code-Ablauf hier nicht unterbrochen - wie soll man denn sonst sauber ein release senden? Alledings wäre ein "autorelease" in der alloc-init-Kombi wohl die "richtigere" Lösung gewesen ...