I'm tearing my hair out over this gotcha and have been for a couple of weeks. XCode 4.2 with build aimed at IOS4, so I'm dealing with .XIB files.
I'm writing an iphone app with two tabs provided via tabBar, 1) my artists, 2) all artists. Each of the tabs has a UITableview that is fancy. There is also a detail view which desplays more information about the work. (There is also a HUD display which is a copy of Matej Bukovinski's MBProgressHUD)
When I call didSelectRowAtIndexPath I can't bring up the detail view to save my life. (It does fire correctly.
I know I've got to be missing something basic but... I just can't find it to save my life.
Thanks in advance.
-Rob
AppDelegate.h
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate> {
UINavigationController *navigationController;
}
@property (strong, nonatomic) UINavigationController *navigationController;
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UITabBarController *tabBarController;
@end
AppDelegate.m
#import "AppDelegate.h"
#import "MyArtistsViewController.h"
#import "SecondViewController.h"
#import "TicketDetailView.h"
#import "viewTest.h"
@implementation AppDelegate
@synthesize window = _window;
@synthesize tabBarController = _tabBarController;
@synthesize navigationController =_navigationController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
//Test on navigationController
//navigationController = [[UINavigationController alloc] initWithRootViewController:MyArtistsViewController];
// Override point for customization after application launch.
UIViewController *viewController1 = [[MyArtistsViewController alloc] initWithNibName:@"MyArtistsViewController" bundle:nil];
//UINavigationController *viewController1 = [[MyArtistsViewController alloc] initWithNibName:@"MyArtistsViewController" bundle:nil];
//UIViewController *tvc = [[TicketViewController alloc] initWithNibName:@"TicketViewController" bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:_tabBarController];
UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
MyArtistsViewController.h
#include "MBProgressHUD.h"
#import "TicketViewController.h"
@interface MyArtistsViewController : UIViewController
<MPMediaPickerControllerDelegate, UITableViewDelegate,CLLocationManagerDelegate,
UITableViewDataSource, MBProgressHUDDelegate>
{
IBOutlet UITableView *tblEvents;
MBProgressHUD *HUD;
}
@property (nonatomic, retain) TicketViewController *detailViewController;
@property (nonatomic, retain) IBOutlet UITableView *tblEvents;
@property (nonatomic, retain) IBOutlet CLLocationManager *locationManager;
@property (nonatomic, retain) NSString *eventID, *artistName;
@end
MyArtistsViewController.m
#import "MyArtistsViewController.h"
@synthesize ticketViewController;
@synthesize detailViewController;
@synthesize tblEvents;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = NSLocalizedString(@"Master", @"Master");
}
return self;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (!self.detailViewController) {
self.detailViewController = [[TicketViewController alloc] initWithNibName:@"TicketViewController" bundle:nil];
}
[self.navigationController pushViewController:self.detailViewController animated:YES];
}
- (void)viewDidLoad
//Create the Spinner or (HUD, Heads Up Display) to let the User know whats going on.
HUD = [[MBProgressHUD alloc] initWithView:self.view]; [self.view addSubview:HUD];
[self.navigationController.view addSubview:HUD];
HUD.delegate = self;
HUD.labelText = @"Loading";
HUD.detailsLabelText = @"Wow you read this far!";
HUD.square = YES;
[HUD show:YES];
// Does a bunch of stuff
[HUD show:NO];
In AppDelegate.m, you must add UINavigationController to tab bar view controler instead of normal View controller :
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
//Test on navigationController
//navigationController = [[UINavigationController alloc] initWithRootViewController:MyArtistsViewController];
// Override point for customization after application launch.
UIViewController *artistsVC = [[[MyArtistsViewController alloc] initWithNibName:@"MyArtistsViewController" bundle:nil] autorelease]; //remove autorelease if ARC support
UINavigationController *viewController1 = [[[UINavigationController alloc] initWithRootViewController:artistsVC] autorelease];
//UIViewController *tvc = [[TicketViewController alloc] initWithNibName:@"TicketViewController" bundle:nil];
//self.navigationController = [[UINavigationController alloc] initWithRootViewController:_tabBarController];
UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
}