Tabbar & TableView

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

  • Tabbar & TableView

    Hallo Ihr,

    ich habe ein Problem mit meinem App.
    In diesem App gibt es 3 Tabbar Items wobei in dem mittleren eine tableview eingebettet ist.
    Es funktioniert alles perfekt bis auf die Aktualisierung der Tableview.
    In einem anderen Tab kann die Tableview verändert werden (durch bestimmte Aktionen etc.). Wenn ich nun in den mittleren Tab zur Tabelle zurückgehe ist diese nicht aktualisiert.
    Die Tabelle wird erst richtig aktualisiert nachdem das App komplett neu gestartet worden ist.
    Die Datasource ist ein Array das richtig bestückt wird. Durch Google habe ich bisher nur Tipps bekommen die nichts geholfen haben. Ich habe reloadData bereits in allen möglichen Methoden eingebaut aber nichts hilft.
    Ich brauche echt dringend Hilfe bin leider noch blutiger Anfänger was Objective-C betrifft...


    Quellcode

    1. #import <UIKit/UIKit.h>
    2. #import "HomeViewController.h"
    3. @interface FoundPTableViewController : UITableViewController <UITableViewDataSource> {
    4. NSString *plistfilepath_found;
    5. NSMutableArray *parray_found;
    6. IBOutlet UITableView *tableView;
    7. }
    8. -(void)viewWillAppear:(BOOL)animated;
    9. @property (nonatomic, retain) NSString *plistfilepath_found;
    10. @property (nonatomic, retain) NSMutableArray *parray_found;
    11. @property (nonatomic, retain) UITableView *tableView;
    12. @end
    Alles anzeigen


    Quellcode

    1. @implementation FoundPTableViewController
    2. @synthesize tableView;
    3. @synthesize plistfilepath_found;
    4. @synthesize parray_found;
    5. #pragma mark -
    6. #pragma mark Initialization
    7. #pragma mark -
    8. #pragma mark View lifecycle
    9. - (void)viewWillAppear:(BOOL)animated {
    10. [self.tableView reloadData];
    11. [self viewDidLoad];
    12. [super viewWillAppear:animated];
    13. }
    14. #pragma mark -
    15. #pragma mark Table view data source
    16. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    17. return [parray_found count];
    18. }
    19. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    20. static NSString *CellIdentifier = @"Cell";
    21. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    22. if (cell == nil) {
    23. cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    24. }
    25. // Set up the cell...
    26. NSString *cellValue = [parray_found objectAtIndex:indexPath.row];
    27. cell.text = cellValue;
    28. return cell;
    29. }
    30. #pragma mark -
    31. #pragma mark Table view delegate
    32. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    33. }
    34. #pragma mark -
    35. #pragma mark Memory management
    36. - (void)didReceiveMemoryWarning {
    37. [super didReceiveMemoryWarning];
    38. }
    39. - (void)viewDidLoad {
    40. [super viewDidLoad];
    41. UIViewController *HomeViewInstanz = [HomeViewController alloc];
    42. plistfilepath_found = [HomeViewInstanz initializePathLose:@"lose_found.plist"];
    43. parray_found = [HomeViewInstanz getPList:plistfilepath_found];
    44. }
    45. //dealloc method declared in RootViewController.m
    46. - (void)dealloc {
    47. [super dealloc];
    48. }
    Alles anzeigen
  • Es kann zwei Gründe geben. Das tableView-Outlet ist nicht gesetzt, also nil oder Du veränderst das Array nicht.

    Das roloadData bringt natürlich nur etwas, wenn Du parray_found auch veränderst. Du solltest hierfür auch möglichst kein mutable Array verwenden:

    Quellcode

    1. @interface FoundPTableViewController : UITableViewController <UITableViewDataSource> {
    2. NSString *plistfilepath_found;
    3. NSArray *parray_found;
    4. IBOutlet UITableView *tableView;
    5. }
    6. -(void)viewWillAppear:(BOOL)animated;
    7. @property (nonatomic, retain) NSString *plistfilepath_found;
    8. @property (nonatomic, copy) NSArray *parray_found;
    9. @property (nonatomic, retain) UITableView *tableView;
    10. @end
    Alles anzeigen


    Für das Array implementierst Du den Setter selber, so dass immer ein reloadData gesendet wird, wenn Du das Array veränderst:

    Quellcode

    1. - (void)setParray_found:(NSArray *)inArray {
    2. if(inArray != parray_found) {
    3. [parray_found autorelease];
    4. parray_found = [inArray copy];
    5. [tableView reloadData];
    6. }
    7. }


    Immer, wenn Du den Setter aufruftst, wird dann Deine Tabelle auch aktualisiert.
    „Meine Komplikation hatte eine Komplikation.“
  • So,

    ich hab des mit dem Setter getestet, leider hat das reload keine Auswirkung auf die tableview.
    Ich bin langsam echt verzweifelt.
    Meine eigene Idee war, diese Methode:

    Quellcode

    1. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    2. return [parray_found count];
    3. }


    nochmal auszuführen. Dieser TEil wird nur beim ersten mal Aufgerufen und dort wird doch die anzahl der Zellen festegelegt oder?
    Meine Idee ist, dass sich die ANzahl der angezeigten Zeilen im tableView nicht erhöht und somit die angehängten Zeilen nicht angezeigt werden.
    Kann das sein? Kann man diese Methode manuell nochmal aufrufen?
  • sideshowbob1984 schrieb:

    Meine eigene Idee war, diese Methode:

    Quellcode

    1. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    2. return [parray_found count];
    3. }


    nochmal auszuführen. Dieser TEil wird nur beim ersten mal Aufgerufen und dort wird doch die anzahl der Zellen festegelegt oder?
    Meine Idee ist, dass sich die ANzahl der angezeigten Zeilen im tableView nicht erhöht und somit die angehängten Zeilen nicht angezeigt werden.
    Kann das sein? Kann man diese Methode manuell nochmal aufrufen?

    Du kannst die Methode zwar manuell aufrufen, aber davon hat der TableView überhaupt nichts. Der TableView ruft diese Methode auf, wenn er sich die Daten holt.
    In der Methode viewWillAppear: selbst die Methode viewDidLoad auf. Das ist verkehrt, denn das macht das System. Da Du in der viewDidLoad dann, wie ich vermute, immer die Daten neu aus der gespeicherten Datei lädst, überschreibst Du die gerade gemachten Änderungen am Array gleich wieder. Also rufe nicht selbst viewDidLoad auf.

    Michael
  • Kurz zum Verständniss um was es geht:
    In meiner App ist es möglich Lose zu ziehen. Bei einem Treffer wird das oben angegebene Array gefühlt.

    Ich rufe den Setter ausserhalb der Klasse auf. In der Klasse die die "ziehe Los" methoden hat.
    Wenn ein Los gefunden wurde und das Array aktuallisiert wird (ich möchte nochmal betonen dass, das Array 100%ig korrekt gefüllt wird. DAs PRoblem liegt am Tableview)
    rufe ich den setter auf und gib der Methode das gerade aktualisierte array mit. Die Methode wird korrekt aufgerufen, die beiden Arrays die verglichen werden sind logischerweise noch ungleich, da das array noch nicht in die plist geschrieben worden ist. Der reload wird ausgeführt aber das tableview ändert sich nicht.
    Ich versteh das nicht.... :(

    Danke nochmal für die Hilfe!
  • Ja ich hab da so ne Table View Controller Identity die das als Klasse hat.
    Aber wenn ich die Klasse rauslösche ist die Tabelle leer...

    So jetzt folgende Situation.

    Ich habe folgende Klassen:
    PAppDelegate
    HomeViewController
    FoundPTableViewController
    WebViewController

    Zusätzlich habe ich ne XIB Datei für MainWindow und WebView.

    In der XIB Datei für MainWindow gibts mehrere Elemente:
    - Files Owner
    - First Responder
    - PAppDelegate
    - Tab Bar Controller

    In der Tab Bar Controller File habe ich die ganze App designed.
    In der 2. Tab ist ein einem normalen View die Tableview eingebettet.
    Im Moment ist dafür im Interface builder weder ein Delegate noch eine Data Source definiert. (Da war zuvor anscheinend die falsche Instanz) angegeben.

    Wie gehe ich jetzt vor?

    Danke und Gruß