views:

110

answers:

2

Hi,

I have created a Tab Bar Application, removed the default FirstView and SecondView and added the following two ViewControllers:

  1. JustAnotherView (which is simply a UIViewController with a UIView inside)
  2. MyListOfItems (which is a UIViewController with a TableView inside)

I have a 3rd ViewController called ListOfItemsDetailViewController with a UIView inside that is supposed to be called when the user touches one of the TableView cells.

The application compiles without issue. I can touch both Tab Bar buttons and the correct View appear.

PROBLEM: When I click a TableView cell, the code to switch to the Detail View is executed (without crashing or error), but the View is NEVER shown.

Here is a screenshot of the application and the debugger with an NSLog that shows it made it past the pushViewController without crashing:

http://clip2net.com/clip/m52549/thumb640/1281588813-9c0ba-161kb.jpg

Here is the code.

MyListOfItemsViewController.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "ListOfItemsDetailViewController.h";

@interface MyListOfItemsViewController : UIViewController {
    ListOfItemsDetailViewController *listOfItemsDetailViewController;
}

@property (nonatomic, retain) ListOfItemsDetailViewController *listOfItemsDetailViewController;


@end

Here is the MyListOfItemsViewController.m file:

#import "MyListOfItemsViewController.h"
@implementation MyListOfItemsViewController
@synthesize listOfItemsDetailViewController;

#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad {
    [super viewDidLoad];

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
    self.title = @"My List Of Items";
    NSLog(@"My List Of Items Did Load");
}

#pragma mark -
#pragma mark Table view data source
// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return 5;
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    NSString *cellMessage;

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

    cellMessage = [NSString stringWithFormat:@"indexPath: %d",indexPath.row];       
    cell.textLabel.text = cellMessage;
    return cell;
}

#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    ListOfItemsDetailViewController *vcListOfItemsDetail = [[ListOfItemsDetailViewController alloc] 
                                    initWithNibName:@"ListOfItemsDetail" bundle:[NSBundle mainBundle]];
    self.listOfItemsDetailViewController = vcListOfItemsDetail;
    [vcListOfItemsDetail release];
    [self.navigationController pushViewController:self.listOfItemsDetailViewController animated:YES];

    NSLog(@"Did Execute didSelectRowAtIndexPath WITHOUT Crashing or Error.");

}

#pragma mark -
#pragma mark Memory management

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Relinquish ownership any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
    NSLog(@"My List Of Items View Did Unload");
}


- (void)dealloc {
    [super dealloc];
}



@end

Please help. It will be very much appreciated!!!

I have been driving myself crazy trying to get basic navigation down in the iOS platform.

Also, pardon the layperson question, I know that most of you already understand how to do this.

Thanks in advance. Jaosn

A: 

In tableView:didSelectRowAtIndexPath: you are referencing a navigationController by self.navigationController, that likely doesn't exist. You have to use a UINavigationController as one view controller in you tabView and the rootViewController of that navigationController should be MyListOfItemsViewController.

Please note that you need a UINavigationController for your detail view to push on and self.navigationController is only a way to retrieve one, that has been created and inserted into the hierarchy before.

tonklon
Thank you very much. This is exactly what I was looking for. When I got this, a lot of things became more clear in iOS development.
JasonBub
A: 

Instead of making the 2nd tab's viewcontroller to be a tableviewcontroller, make it a UINavigationController and set the navcontroller's RootViewController as "MyListOfItems". Once you do that, you will have access to the navigationController property in your viewcontroller and can use push and pop.

Or if you don't want to do this, the only way left would be to animate between the views programatically (i.e. remove one view and add the other one or add the other view on top of the current view)

lostInTransit
Thanks a lot for your response. It is exactly what I was looking for. Very clear. I awarded the correct response to the first one in, as they seem to both be pointing me in the same direction (which as, I was missing the all important UINavigation controller - duh, when you think about it in retrospect).
JasonBub
this is really the link that helped me understand what was going on: http://stackoverflow.com/questions/284321/hidden-uinavigationcontroller-inside-uitabbarcontroller
JasonBub