PushViewController не работает - PullRequest
       6

PushViewController не работает

1 голос
/ 22 августа 2010

Я пытаюсь изучить 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.

Ответы [ 2 ]

3 голосов
/ 22 августа 2010

В пути я вижу 2 вещи в вашем кодексе.

1) Подключили ли вы IBAction к кнопке, что должно вызвать изменение? (в InterfaceBuilder)

2) В вашем методе GoToViewTwo вы выделяете gClient, но никогда не отпускаете его. Таким образом, вы производите утечку памяти.

Мое предложение: добавьте NSLog(@'Was in GoToViewTwo-Method') в ваш метод GoToViewTwo, чтобы проверить, выполняется ли он при использовании вашей программы. Таким образом, вы можете увидеть, является ли viewcontroller проблемой, или показать, что это проблема. ; -)

Извините за мой английский. Я знаю, что это не самое лучшее, но я старался писать как можно лучше. ; -)

0 голосов
/ 22 августа 2010

Вы установили ваш NavigationController в IB?

В противном случае я не вижу места, где вы используете его в своем коде.

...