Hi, I am trying to learn Objective-C and have run into a problem with pushing a new View controller when a Button is clicked. I have a switch View Controller that is responsible for pushing the settings.nib file when I press the settings toolbar button. Here is the code of the ViewController:
//
// ViewController.h
// iReader
//
// Created by Vivek Manjunath on 22/08/10.
// Copyright (c) 2010 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@class ReaderMain;
@class Settings;
@class GoogleClientLogin;
@interface ViewController : UIViewController {
ReaderMain *readerMain;
Settings *settings;
GoogleClientLogin *gClientLogin;
UIBarButtonItem *mSignInOutButton;
UIBarButtonItem *mRefresh;
}
@property (nonatomic, retain) ReaderMain *readerMain;
@property (nonatomic, retain) Settings *settings;
@property (nonatomic, retain) GoogleClientLogin *gClientLogin;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *signInOutButton;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *refreshButton;
-(IBAction) switchViews:(id)sender;
@end
ViewController.m file
//
// ViewController.m
// iReader
//
// Created by Vivek Manjunath on 22/08/10.
// Copyright (c) 2010 __MyCompanyName__. All rights reserved.
//
#import "ViewController.h"
#import "ReaderMain.h"
#import "Settings.h"
@implementation ViewController
@synthesize readerMain;
@synthesize settings;
@synthesize signInOutButton = mSignInOutButton;
@synthesize refreshButton =mRefresh;
@synthesize gClientLogin;
/*
// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
// Custom initialization
}
return self;
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
ReaderMain *readerController= [[ReaderMain alloc] initWithNibName:@"ReaderMain" bundle:nil];
self.readerMain = readerController;
[self.view insertSubview:readerController.view atIndex:0];
[readerController release];
[super viewDidLoad];
}
-(IBAction)switchViews:(id)sender
{
if(self.settings ==nil)
{
//[mSignInOutButton setTitle:@"SignIn"];
Settings *googleController = [[Settings alloc]initWithNibName:@"Settings" bundle:nil];
self.settings = googleController;
[googleController release];
}
[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.00];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
if(readerMain.view.superview ==nil)
{
[mSignInOutButton setTitle:@"Settings"];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:NO];
[readerMain viewWillAppear:YES];
[settings viewWillDisappear:YES];
[settings.view removeFromSuperview];
[self.view insertSubview:readerMain.view atIndex:0];
[settings viewDidDisappear:YES];
[readerMain viewDidAppear:YES];
//[mSignInOutButton setTitle:@"SignOut"];
}
else
{
[mSignInOutButton setTitle:@"Back"];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:NO];
[settings viewWillAppear:YES];
[readerMain viewWillDisappear:YES];
[readerMain.view removeFromSuperview];
[self.view insertSubview:settings.view atIndex:0];
[readerMain viewDidDisappear:YES];
[settings viewDidAppear:YES];
}
[UIView commitAnimations];
}
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[readerMain release];
[settings release];
[mSignInOutButton release];
[mRefresh release];
[super dealloc];
}
@end
This works as expected. After loading the settings.nib file, I want to load another viewController for advanced settings. I tried to do this as below:
Settings.h file
//
// Settings.h
// iReader
//
// Created by Vivek Manjunath on 22/08/10.
// Copyright (c) 2010 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface Settings : UIViewController {
IBOutlet UIButton *googleReaderSettings;
}
@property (nonatomic, retain) IBOutlet UIButton *googleReaderSettings;
-(IBAction) goToViewTwo;
@end
The settings.m file
//
// Settings.m
// iReader
//
// Created by Vivek Manjunath on 22/08/10.
// Copyright (c) 2010 __MyCompanyName__. All rights reserved.
//
#import "Settings.h"
#import "GoogleClientLogin.h"
#import "iReaderAppDelegate.h"
@implementation Settings
@synthesize googleReaderSettings;
-(IBAction)goToViewTwo{
GoogleClientLogin *gClient=[[GoogleClientLogin alloc]initWithNibName:@"GoogleClientLogin" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:gClient animated:YES];
[gClient release];
}
/*
// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
// Custom initialization
}
return self;
}
*/
/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
}
*/
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[googleReaderSettings release];
[super dealloc];
}
@end
Finally my Delegate File:
//
// iReaderAppDelegate.h
// iReader
//
// Created by Vivek Manjunath on 22/08/10.
// Copyright (c) 2010 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@class ViewController;
@class Settings;
@interface iReaderAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
IBOutlet ViewController *switchViewController;
IBOutlet ViewController *settings;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet ViewController *switchViewController;
@property (nonatomic, retain) IBOutlet ViewController *settings;
@end
And the Delegate.m file
//
// iReaderAppDelegate.m
// iReader
//
// Created by Vivek Manjunath on 22/08/10.
// Copyright (c) 2010 __MyCompanyName__. All rights reserved.
//
#import "iReaderAppDelegate.h"
#import "ViewController.h"
@implementation iReaderAppDelegate
@synthesize window;
@synthesize switchViewController, settings;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[window addSubview:switchViewController.view];
[window addSubview:settings.view];
[window makeKeyAndVisible];
return YES;
}
- (void)applicationWillTerminate:(UIApplication *)application {
// Save data if appropriate.
}
- (void)dealloc {
[window release];
[switchViewController release];
[settings release];
[super dealloc];
}
@end
But, when I press the button to load the GoogleClientLogin view, it does nothing. There is no console output either. Can someone help me with this issue? I fixed the memory leaks and NSLog shows that it is entering goToViewTwo.