Tab Bar Controller und TableView

  • Tab Bar Controller und TableView

    Guten Tag Forum,

    irgendetwas passt nicht. Ich bekomme immer folgende Fehlrmeldung:

    Quellcode

    1. 2010-03-14 12:52:05.970 Messe[1311:207] *** -[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x3a230c0
    2. 2010-03-14 12:52:05.971 Messe[1311:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x3a230c0'
    3. 2010-03-14 12:52:05.972 Messe[1311:207] Stack: (
    4. 30901339,
    5. 2536416521,
    6. 31283259,
    7. 30852726,
    8. 30705346,
    9. 4372602,
    10. 4379978,
    11. 4378975,
    12. 3095514,
    13. 3036025,
    14. 3077460,
    15. 3066015,
    16. 57414320,
    17. 57413743,
    18. 57411782,
    19. 57410874,
    20. 57444408,
    21. 30687826,
    22. 30684767,
    23. 30682184,
    24. 38991757,
    25. 38991954,
    26. 2777091,
    27. 9148,
    28. 9002
    29. )
    Alles anzeigen


    Ich habe eine XIB Datei die den Tab Bar Controller aufnimmt (MainWindow.xib). In diesem View habe ich dann zwei Views die ich verbinden möchte. Im ersten eine einfache Seite. Im zweiten eine Tabelle mit Sektionen und Index. Pro Eintrag soll dann eine weitere Tabelle geöffnet werden und schlussendlich pro Subtabelleneintrag die Detailansichten.

    Zum Aufbau:
    Im MainWindow.xib wurde ein Tab Bar Controller eingefügt und für den ersten View die Verbindung vom ersten Tab zum StartpageView.xib. Nun wurde der zweite Tab mit dem IndexedSectionView.xib verbunden.

    Im IndexSectionView wurde ein TableView eingefügt. Delegate und Datasource wurden mit FristResponder verbunden und Firstrespornder wurde auf meine IndexedSectionViewController gelegt.
    Hier der Code vom IndexedSectionViewController:


    PHP-Quellcode

    1. #import <UIKit/UIKit.h>
    2. @interface IndexedSectionViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
    3. NSDictionary *names;
    4. NSArray *keys;
    5. NSArray *controllers;
    6. }
    7. @property (nonatomic, retain) NSDictionary *names;
    8. @property (nonatomic, retain) NSArray *keys;
    9. @property (nonatomic, retain) NSArray *controllers;
    10. @end
    Alles anzeigen


    und

    PHP-Quellcode

    1. #import "IndexedSectionViewController.h"
    2. #import "SecondLevelViewController.h"
    3. #import "DetailListTableView.h"
    4. @implementation IndexedSectionViewController
    5. @synthesize names, keys, controllers;
    6. - (void) viewDidLoad {
    7. //self.title = @"xxx";
    8. NSLog(@"Calling viewDidLoad IndexedSection");
    9. NSMutableArray *initControllers = [[NSMutableArray alloc] init];
    10. NSString *path = [[NSBundle mainBundle] pathForResource:@"sortednames" ofType: @"plist"];
    11. NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile: path];
    12. self.names = dict;
    13. [dict release];
    14. NSArray *initKeys = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
    15. self.keys = initKeys;
    16. //Add new Views
    17. for( int i = 0 ; i < [self.keys count]; i++)
    18. {
    19. NSArray *nameSections = [self.names objectForKey:[self.keys objectAtIndex: i]];
    20. for (NSString *name in nameSections){
    21. DetailListTableView *detailListViewController = [[DetailListTableView alloc] initWithStyle: UITableViewStylePlain];
    22. detailListViewController.title = name;
    23. //Image hinzufügen moveMeController.rowImage = [UIImage imageNamed:@"moveMeIcon.png"];
    24. [initControllers addObject: detailListViewController];
    25. [detailListViewController release];
    26. }
    27. }
    28. self.controllers = initControllers;
    29. [initControllers release];
    30. [super viewDidLoad];
    31. }
    32. - (void)viewDidUnload {
    33. self.names = nil;
    34. self.keys = nil;
    35. self.controllers = nil;
    36. [super viewDidUnload];
    37. }
    38. - (void)dealloc {
    39. self.names = nil;
    40. self.keys = nil;
    41. self.controllers = nil;
    42. [super dealloc];
    43. }
    44. - (NSString *) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger) section {
    45. return [keys objectAtIndex:section];
    46. }
    47. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    48. return [self.keys count];
    49. }
    50. - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
    51. {
    52. return keys;
    53. }
    54. - (NSInteger)tableView:(UITableView *)tableView
    55. numberOfRowsInSection:(NSInteger)section
    56. {
    57. return [self.controllers count];
    58. }
    59. - (UITableViewCell *)tableView:(UITableView *)tableView
    60. cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    61. static NSString *FirstLevelCell= @"FirstLevelCell";
    62. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
    63. FirstLevelCell];
    64. if (cell == nil) {
    65. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
    66. reuseIdentifier: FirstLevelCell] autorelease];
    67. }
    68. // Configure the cell
    69. NSUInteger row = [indexPath row];
    70. SecondLevelViewController *controller = [self.controllers objectAtIndex:row];
    71. cell.textLabel.text = controller.title;
    72. cell.imageView.image = controller.rowImage;
    73. cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    74. return cell;
    75. }
    76. #pragma mark -
    77. #pragma mark Table View Delegate Methods
    78. - (void)tableView:(UITableView *)tableView
    79. didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    80. NSUInteger row = [indexPath row];
    81. SecondLevelViewController *nextController = [self.controllers
    82. objectAtIndex:row];
    83. [self.navigationController pushViewController:nextController animated:YES];
    84. }
    85. @end
    Alles anzeigen

    Aufrufen des ersten View klappt. Aufrufen des Tableviews endet in dem oben gezeigten Fehler. Finde einfach nicht den Urheber. Jemand eine Idee. Vielen Dank im Voraus...

    fin
  • die fehlermeldung deutet darauf hin, dass du die delegate-methoden für dein uitableview nicht implementiert hast, den view-controller aber delegate des tableView zuwiesen hast. implementiere die pflicht-methoden, dann sollte es klappen.

    ich korrigiere mich. du hast die klasse deines view-controllers nicht richtig gesetzt. es wird uiviewcontroller und nicht IndexedSectionViewController instanziert.

    wenn du das nicht hinbekommen solltest, lade einfach das projekt ohne den build-ordner hoch.

    gruss walter
  • Hallo Walter,

    danke für die Unterstützung!

    Ich dachte das habe ich für das UITableViewDataSource hiermit schon getan:

    PHP-Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView
    2. cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    3. static NSString *FirstLevelCell= @"FirstLevelCell";
    4. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
    5. FirstLevelCell];
    6. if (cell == nil) {
    7. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
    8. reuseIdentifier: FirstLevelCell] autorelease];
    9. }
    10. // Configure the cell
    11. NSUInteger row = [indexPath row];
    12. SecondLevelViewController *controller = [self.controllers objectAtIndex:row];
    13. cell.textLabel.text = controller.title;
    14. cell.imageView.image = controller.rowImage;
    15. cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    16. return cell;
    17. }
    18. - (NSInteger)tableView:(UITableView *)tableView
    19. numberOfRowsInSection:(NSInteger)section
    20. {
    21. return [self.controllers count];
    22. }
    Alles anzeigen
  • ...ich hatte mich bereits korrigiert. du hast bei deinem tab-bar-controller die view-controller deiner nibs nicht korrekt gesetzt. ist ne simple sache. deswegen werden die delegate-methoden an eine uiview-controller instanz geschickt, da sollen sie aber nicht hin.

    grusss
  • Original von finarfin
    Ich hab es, ich musste noch die Klassen, wie Du gesagt hat setzen. Und zwar genau auf IndexedSectionViewController und StartpageViewController in er Tab Bar. Ok trotzdem Danke!


    ok. aber was du da alles machst in deiner app ist schon ziemlich fragwürdig. es sieht eigentlich alles aus wie kraut und rüben. du solltest dir dringend die einführende literatur durchlesen.

    gruss walter