anuragbh
anuragbh

Reputation: 593

Tabbed ios application with multiple table views

I'm using XCode 4.2 and testing my build on iPad 5.0.

I started building an application using the standard Tabbed application in XCode and then added code to have 2 uitableviews inside the first tab.

It compiles, but the table data does not load into the view.

App delegate.h:

@interface dmbAppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) UITabBarController *tabBarController;

@end

AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    UIViewController *viewController1 = [[[dmbFirstViewController alloc] initWithNibName:@"dmbFirstViewController" bundle:nil] autorelease];
    UIViewController *viewController2 = [[[dmbSecondViewController alloc] initWithNibName:@"dmbSecondViewController" bundle:nil] autorelease];
    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
    NSLog(@"Loading first tab view from app delegate...");
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

FirstViewController.h:

@interface dmbFirstViewController : UIViewController {

    ReservationsTable *reservationsController;
    WaitlistTable *waitlistController;
    IBOutlet UITableView *reserveTable;
    IBOutlet UITableView *waitlistTable;
}

FirstViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSLog(@"FirstView Controller - View Loading Started");

    [reserveTable setDataSource:reservationsController];
    [waitlistTable setDataSource:waitlistController];

    NSLog(@"FirstView Controller - Loading Table Views..");

    [reserveTable setDelegate:reservationsController];
    [waitlistTable setDelegate:waitlistController];
    reservationsController.view = reservationsController.tableView;
    waitlistController.view = waitlistController.tableView;

    NSLog(@"FirstView Controller - View Loading Finished");
}

Both the tables have a .h and .m with the standard table methods implemented. I also added 2 tables in the first view nib file and linked them to the file owner.

Update: ReserveTable.h:

    @interface WaitlistTable : UITableViewController <UITableViewDataSource, UITableViewDelegate>{
        NSMutableArray *waitlistitems;
    }

ReserveTable.m:

- (void)viewDidLoad
{
    NSLog(@"View Did Load - Wait List Table");
    waitlistitems = [[NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"6",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17",nil] retain];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    NSLog(@"Inside number of section for Wait List table...");
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"Inside numberofRows for Wait List table...");
    // Return the number of rows in the section.
    return [waitlistitems count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Inside cell for row at index path for Wait List table...");
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    cell.textLabel.text = [NSString stringWithFormat:@"1.%@" ,[waitlistitems objectAtIndex:indexPath.row]];    
    return cell;
}

Thoughts?

Upvotes: 1

Views: 1856

Answers (2)

Justin Paulson
Justin Paulson

Reputation: 4388

Change your viewDidLoad to this:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    reservationsController = [[ReservationsTable alloc] init];
    waitlistController = [[WaitlistTable alloc] init];

    NSLog(@"FirstView Controller - View Loading Started");

    [reserveTable setDataSource:reservationsController];
    [waitlistTable setDataSource:waitlistController];

    NSLog(@"FirstView Controller - Loading Table Views..");

    [reserveTable setDelegate:reservationsController];
    [waitlistTable setDelegate:waitlistController];

    NSLog(@"FirstView Controller - View Loading Finished");
 }

basically, you are never initializing your tableViewControllers (I guess that is the name of both of them, I would change their names to something like "WaitlistTableViewController" and "ReservationsTableViewController", but that is just me.) Also, setting the 'tableView' to the 'view' is unnecessary.

Or even better, initialize them in the init method for your dmbFirstViewController.

Or just use dmbFirstViewController like this:

dmbFirstViewController.h:

@interface dmbFirstViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

    ReservationsTable *reservationsController;
    WaitlistTable *waitlistController;
    IBOutlet UITableView *reserveTable;
    IBOutlet UITableView *waitlistTable;
    NSMutableArray *waitlistitems;
    NSMutableArray *reserveitems;
}

dmbFirstViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


    waitlistitems = [[NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"6",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17",nil] retain];

    NSLog(@"FirstView Controller - View Loading Started");

    [reserveTable setDataSource:self];
    [waitlistTable setDataSource:self];

    NSLog(@"FirstView Controller - Loading Table Views..");

    [reserveTable setDelegate:self];
    [waitlistTable setDelegate:self];

    NSLog(@"FirstView Controller - View Loading Finished");
}

- (void)viewDidAppear:(BOOL)animated
{
    [reserveTable reloadData];
    [waitlistTable reloadData];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    NSLog(@"Inside number of section for Wait List table...");
    if(tableView == waitlistTable)
    {
        //Return sections for waitlistTable
        return 1;
    }else{
        //Return sections for reservedTable
        return 1;
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if(tableView==waitlistTable)
    {
        NSLog(@"Inside numberofRows for Wait List table...");
        // Return the number of rows in waitlistTable section.
        return [waitlistitems count];
    }else{
        // Return the number of rows in reservedTable section.
        return [reserveditems count];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    if(tableView == waitlistTable)
    { 
        NSLog(@"Inside cell for row at index path for Wait List table...");
        static NSString *CellIdentifier = @"Cell";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }

        // Configure the cell...
        cell.textLabel.text = [NSString stringWithFormat:@"1.%@" ,[waitlistitems objectAtIndex:indexPath.row]];    
        return cell;
    } else {
        //Create cell for reservedTable Cell
        .....
        return cell;
    }
}

You'll have to finish off the part about reservedTable cells, I didn't have that code. Plus, I guessed on the items array for reservedTable and did not initialize it.

Upvotes: 1

Phillip
Phillip

Reputation: 4306

I think in your firstViewController you should push the views. Assuming that reserveTable is your main table, push it like so

[self.view addSubView:reserveTable];

Also, did you import the ReserveTable.h to your firstViewController?

If yes, you should initialize the table there though.

But what i suggest, though, is to transform the firstViewController in a tableViewController, editing the App Delegate and the firstViewController.h and m, and from there initialize the table (even adding the other one too). So that would be easier!

Upvotes: 1

Related Questions