【问题标题】:UINavigationController pushViewController in viewDidLoad not workingviewDidLoad 中的 UINavigationController pushViewController 不起作用
【发布时间】:2011-07-30 01:43:51
【问题描述】:

我的AppDelegate 中有以下代码:

#import <UIKit/UIKit.h>

@class PersonalDiarySystemViewController;

@interface PersonalDiarySystemAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    PersonalDiarySystemViewController *viewController;
    UINavigationController *navigationController;

}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet PersonalDiarySystemViewController *viewController;
@property (nonatomic, retain) UINavigationController *navigationController;

@end

#import "PersonalDiarySystemAppDelegate.h"
#import "PersonalDiarySystemViewController.h"

@implementation PersonalDiarySystemAppDelegate

@synthesize window;
@synthesize viewController;
@synthesize navigationController;

#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    // Set the view controller as the window's root view controller and display.
    self.window.rootViewController = self.viewController;
    navigationController = [[UINavigationController alloc] initWithRootViewController:self.window.rootViewController];  
    navigationController.navigationBar.tintColor = [UIColor   
                                                         colorWithRed:217.0/255   
                                                         green:33.0/255 
                                                         blue:0   
                                                         alpha:1];
    navigationController.navigationBarHidden = YES;
    [self.window addSubview:navigationController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

我的 rootviewcontroller 尝试在其 viewDidLoad 方法中将另一个视图控制器加载到导航控制器堆栈中,但由于某种原因视图没有被推送:

-(void) viewDidLoad{    
    lvc = [[LoginViewController alloc] init];
    //lvc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [lvc setDelegate:self]; 
    //[self presentModalViewController:lvc animated:YES];   
    [self.navigationController pushViewController:lvc animated:YES];    
}

我没有收到任何错误,所以不确定发生了什么...使用 presentModalViewController 有效...所以真的很困惑!

【问题讨论】:

    标签: iphone objective-c xcode


    【解决方案1】:

    您需要将lvc 分配给LoginViewController

    - (void) viewDidAppear
    {    
        [self performSelector:@selector(loginCheck:) withObject:nil afterDelay:0.5];
    }    
    - (void) loginCheck:(id)sender
    {
        LoginViewController * lvc = [[LoginViewController alloc] init];
        //lvc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [lvc setDelegate:self]; 
        //[self presentModalViewController:lvc animated:YES];   
        [self.navigationController pushViewController:lvc animated:YES];   
    }
    

    【讨论】:

    • 你在导入LoginViewController吗?因为这就是你推动新观点的方式。
    • 您是否尝试过其他方法?也许是一个IBAction 只是为了看看你是否得到结果
    • 另外,在 viewDidAppear: 中,您还需要有 [super viewDidAppear:animated];。另外,用新的解决方案更新了我的答案...
    • 当我把它放在 viewdidappear 中时,它确实会加载它,但在 rootviewcontroller 下方
    【解决方案2】:

    把你的

    [self.navigationController pushViewController:loginViewController];
    

    进入

    - (void)viewDidAppear:(BOOL)animated 
    

    方法。 viewControllers navigationController 在那之前不会被加载

    【讨论】:

      【解决方案3】:

      有两件事可能会出错。 首先,您在applicationDidFinishLaunching 中分配导航控制器,我不太确定哪个在先,applicationDidFinishLaunchingviewDidLoad

      如你所见,你首先设置你的根视图控制器,然后分配导航控制器,然后可能viewDidLoad 在你设置根视图控制器后立即启动,然后分配导航控制器。所以viewDidLoad中的字可能行不通,因为当时导航控制器还没有诞生。

      但我不太喜欢前面的解释。这只是一种可能。

      还有一件奇怪的事,你把导航控制器的导航栏设置为隐藏了

      navigationController.navigationBarHidden = YES;
      

      然后好像用户无法弹回根视图控制器,所以导航控制器不推送登录视图控制器。 同时,模态视图控制器可以在导航栏隐藏或导航栏未分配的情况下关闭,因此当您将其呈现为模态视图控制器时它可以工作。

      但我仍然不太确定,因为我现在在使用 Xcode 时遇到了一些问题,所以我无法测试前两个想法,对此感到抱歉。但我仍然建议您将navigationBarHidden 设置为NO

      【讨论】:

        【解决方案4】:
        - (void)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
        
            // Override point for customization after application launch.
        
            UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
            self.navController = navigationController;
            [mainViewController release];
            [navigationController release];
        
            // Configure and display the window.
            [window addSubview:navController.view];
            [window makeKeyAndVisible];
        }
        
        - (void)viewDidLoad{    
            lvc = [[LoginViewController alloc] init];
            [self.navigationController pushViewController:lvc animated:YES];    
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-14
          • 2013-09-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多