【问题标题】:Strange pushViewController behavior奇怪的 pushViewController 行为
【发布时间】:2013-02-18 14:05:01
【问题描述】:

我的应用程序从 LoginViewController 开始。 登录视图有一个“注册”按钮,代码如下所示。 如果我点击注册,当应用程序启动时,什么也没有发生。但是如果我登录并注销,那么注册按钮可以正常工作。

发生这种情况应该是什么问题?

AppDelegate:

...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.

    //Load View Controllers;

    self.vcClubs = [[[ClubsViewController alloc] init] autorelease];
    self.vcParties = [[[PartiesViewController alloc] init] autorelease];
    self.vcEditProfile = [[[EditProfileViewController alloc] init] autorelease];

    self.navClubs = [[[UINavigationController alloc] initWithRootViewController:self.vcClubs] autorelease];
    self.navClubs.navigationBarHidden = YES;

    self.navParties = [[[UINavigationController alloc] initWithRootViewController:self.vcParties] autorelease];
    self.navParties.navigationBarHidden = YES;

    // Load Login View
    UIViewController *loginView = [[[LoginViewController alloc] init] autorelease];
    self.window.rootViewController = loginView;
    [self.window makeKeyAndVisible];

    return YES;
}
...
- (void)login
{
self.vcMenu = [[[MenuViewController alloc] init] autorelease];
self.vcLocationMenu = [[[LocationMenuViewController alloc] init] autorelease];
self.mainController = [[[MainViewController alloc] init] autorelease];
self.mainController.leftViewController = self.vcMenu;
self.mainController.rightViewController = self.vcLocationMenu;

[self.mainController setMainViewController:self.navParties];
[self.mainController showMainViewControllerAnimated:YES];

self.window.rootViewController = self.mainController;

CATransition *transition = [[[CATransition alloc] init] autorelease];
transition.duration = 1;
transition.type = kCATransitionFade;
transition.subtype = kCATransitionFromBottom;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[self.window.layer addAnimation:transition forKey:@"login"];
}
...

登录控制器.php:

...
- (IBAction)onTapSignupButton:(id)sender
{
RegisterViewController *controller = [[[RegisterViewController alloc] init] autorelease];
[self.navigationController pushViewController:controller animated:YES];
NSLog(@"%@", self.navigationController);
}
...

在应用启动时返回 NSLOG:

2013-02-18 02:18:29.986 App[32652:c07] (null)

【问题讨论】:

  • 当您点击注册时,上面的代码是否被执行(使用断点或NSLog来确定是否调用了代码)。代码本身很好。
  • @Joel 是的,它被执行了,但什么也没发生。
  • controllerself.navigationController 设置一个NSLog() 并检查是否没有一个为nil。
  • 为了完整起见,请发布注销方法。

标签: objective-c xcode


【解决方案1】:

它可能看起来很奇怪。但我犯了同样的错误。希望对你有帮助。。

检查你是否在 AppDelegate 中初始化了 UInavigationController。如果是,我不知道你为什么得到这个......如果不是,请尝试以下代码

RegisterViewController *controller = [[[RegisterViewController alloc] init] autorelease];
UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:controller]
[self.navigationController pushViewController:controller animated:YES];    

根据您编辑的代码

 // Load Login View
UIViewController *loginView = [[[LoginViewController alloc] init] autorelease];
UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:loginView]
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];

编码愉快!!!

【讨论】:

  • @LucianoNascimento 在登录视图控制器中,您没有添加 UINavigationController
  • @LucianoNascimento 检查我的新编辑...如果您从 loginView ViewController 提供 RegisterViewController,则在我的第一部分代码中不需要 UINavigationController。
【解决方案2】:

您第一次尝试时,LoginViewController 似乎没有被包裹在导航控制器中。我会检查登录/注销循环是否将登录控制器放入导航堆栈中,看看为什么在第一次出现登录时没有发生这种情况

【讨论】:

    【解决方案3】:

    试试这个,

    RegisterViewController *controller = [[[RegisterViewController alloc] initWithNibName:@"RegisterViewController" bundle:nil];
    
    [self.navigationController pushViewController:controller animated:YES];
    

    【讨论】:

    • 我想你忘记添加 nibName
    【解决方案4】:
    RegisterViewController *controller = [[[RegisterViewController alloc] init] autorelease];
    [self.navigationController pushViewController:controller animated:YES];
    

    由于 Objective C 内存管理,您的代码不正确 首先,您应该检查您的导航控制器是否不为零。 然后^正确的代码看起来像

    RegisterViewController *controller = [[RegisterViewController alloc] init];
    [self.navigationController pushViewController:controller animated:YES];
    [controller release];
    

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2015-07-20
      • 2010-10-03
      • 2021-07-12
      相关资源
      最近更新 更多