简体   繁体   中英

Switching between View Controllers Error

I'm having a bit of an issue here switching between my view controllers.

I followed the advice on this page:

View Controllers: How to switch between views programmatically?

My setup is as follows; I have a splash screen with a button on it and that button loads my second view controller. I have IntroductionViewController as the root view and the button says "Load Website", this Load Website event I want to switch to WebsiteViewController.

On IntroductionViewController I have set up the button as an IBOutlet and IBAction which is NSLogging fine on Click so I know the method is working.

What I need is when you click Load Website it opens WebsiteViewController. What I have so far is credit of the question above:

IntroductionViewController.h

#import <UIKit/UIKit.h>
#import "WebsiteViewController.h"

@class WebsiteViewController;

@interface IntroductionViewController : UIViewController {
    IBOutlet UIButton *websiteButton;
    IBOutlet WebsiteViewController *websiteViewController;
}
@property (nonatomic, retain) UIButton *websiteButton;
@property (nonatomic, retain) WebsiteViewController *websiteViewController;

-(IBAction)loadWebsite:(id)sender;

@end

IntroductionViewController.m

#import "IntroductionViewController.h"

@implementation IntroductionViewController

@synthesize websiteButton;
@synthesize websiteViewController;

-(IBAction)loadWebsite:(id)sender{
    if(self.websiteViewController.view.superview == nil)
    {
        [self.view addSubview:websiteViewController.view];
    }   
}

The line: [self.view addSubview:websiteViewController.view]; doesn't do anything, but as I've said previously, this function is NSLogging fine. I'm not sure how to proceed with this.

Looks like you are not allocating your websiteViewController, without allocating it you have no instance of it to use or reference to it, logging it will simply return null.

I would also try presenting is a ModalViewController if you are not implementing UINavigationController . Here is an example of allocating your webview controller and presenting it as a modalView:

-(IBAction)loadWebsite:(id)sender{
    WebsiteViewController *webView = [[WebsiteViewController alloc] init];
    [self.view presentModalViewController:webView animated:YES];
    [webView release];
}

The default transition style is UIModalTransitionStyleCoverVertical but check out the documentation for more. You can set the transition style like so:

webView.modalTransitionStyle = UIModalTransitionStyleCoverVertical

I bet your WebsiteViewController object hasn't been instantiated. NSLog(@"%@", websiteViewController); I bet its null: .p You need to create the object - I don't know how to do this using interface builder.

Anyway, you're using the old way to switch between view controllers. The new way/ best way is to use a navigation controller to do it like this:

-(IBAction)loadWebsite:(id)sender{
    [self.navigationController pushViewController:websiteViewController animated:YES];  
}

But this won't work unless you've set up a navigation controller, which I don't know how to do in interface builder. This is why I hate interface builder and believe that you should stop learning with it: :p

Without interface builder this is what you should do:

In your app delegate.h file add this at the top:

#include "IntroductionViewController.h"

Then include this with the other @propertys in the code:

@property (nonatomic, retain) UINavigationController *navController;

Now in your app delegate.m file swap the application did finish launching with options with this:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];

    // lets make the navigation controller by setting up a view controller first.
    IntroductionViewController *viewController = [[IntroductionViewController alloc] initWithNibName:nil bundle:nil];
    viewController.title = @"Home";
    navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    [navController setNavigationBarHidden:NO]; // set to yes to hide the title bar
    [viewController release];

    [self.window addSubview:navController.view];

    return YES;
}

That will give you a navigation controller (you can hide the title bar easily... - see the comments). And show the first view controller (IntroductionViewController).

Now running the code I gave you above will work. The [self.navigationController pushViewController:websiteViewController animated:YES]; . This gives the viewController to the navigationController and the navigationController does all the adding and removing views and such itself!

And you haven't had to use interface builder at all: .p (well... now you have to learn how to build views without dragging and dropping!).

Anyway... i hope that helped.

Possible you may have forgot to bind the IBOutlet to your WebsiteViewController. And for both Orientation support you can use

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOr‌​ientation 
 { 
      // Overriden to allow any orientation. 
      return ((interfaceOrientation==UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation==UIInterfaceOrientationLandscapeRight)); 
 }

One more thought for your orientation problem, you can setFrame to your view while displaying like

 - [yourViewController.view setFrame:CGRectMake(0,0,1024,768)] //iPad and 
 - [yourViewController.view setFrame:CGRectMake(0,0,480,320)] //iPhone.

May be this works.

Thax.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM