我正在尝试学习Objective-C,并且在单击按钮时遇到了推送新View控制器的问题。 我有一个开关View Controller,当我按下设置工具栏按钮时,它负责推送settings.nib文件。以下是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文件
//
// 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
这可以按预期工作。加载了settings.nib文件后,我想加载另一个viewController以进行高级设置。我试着这样做如下:
Settings.h文件
//
// 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
settings.m文件
//
// 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
最后我的代表档案:
//
// 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
和Delegate.m文件
//
// 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
但是,当我按下按钮加载GoogleClientLogin视图时,它什么都不做。也没有控制台输出。有人可以帮我解决这个问题吗?我修复了内存泄漏,NSLog显示它正在进入goToViewTwo。
答案 0 :(得分:3)
在旅途中,我会在您的代码中看到两件事。
1)您是否将IBAction连接到按钮,这应该触发更改? (在InterfaceBuilder中)
2)在GoToViewTwo Methode中,您可以分配gClient但不会释放它。所以你产生了内存泄漏。
我的建议:在你的GoToViewTwo-Method中放一个NSLog(@'Was in GoToViewTwo-Method')
来测试它是否在你使用你的程序时被执行了。所以你可以看看viewcontroller是问题还是显示它是问题。 ; - )
抱歉我的英文。我知道这不是最好的,但我尽力写作。 ; - )
答案 1 :(得分:0)
你在IB中设置了navigationController吗?
否则我看不到你在代码中使用它的地方。