0

我有一個根視圖控制器,它應該加載完成後立即加載另一個視圖控制器(即在viewDidLoad方法中)。iPhone - pushViewController問題

,以推動一個新的視圖控制器送到堆棧我使用的UINavigationController:

以我rootviewcontrollerappdelegate:

-(void) viewDidLoad{ 
     LoginViewController* lvc = [[LoginViewController alloc]init]; 
    [self.navigationController pushViewController:lvc animated:NO]; 
} 

我在視圖控制器文本框和按鈕被加載。上面的內容似乎不起作用......它僅加載一個空白的灰色屏幕,並且不存在UINavigation欄。如果我註釋掉第二行(pushViewController行),那麼我會看到導航欄。所以我認爲它正在加載一些東西,但視圖控制器中正在加載的項目沒有被顯示......任何想法爲什麼?

+3

我完全錯了嗎?因爲你的問題標題與描述不符! :P – Shaunak

+0

當你真正閱讀它時,你會舔磚;) –

回答

0

不能完全確定你想什麼來實現,但是當你實例LoginViewContoller它或許應該是這樣的

LoginViewController* lvc = [[LoginViewController alloc]init]; 
+0

然後lvc肯定指向零;)誰提出了一個聰明的想法,即當你將消息傳遞給nil時不拋出異常? ;) –

+0

這是一個錯字,我在我的代碼中有正確的方式,這不是問題.. – ucabdro

0

檢查navigationController指向零。如果是這樣,嘗試

[self.view addSubview:self.pushViewController.view] 

我有同樣的問題,在這裏發現了上述解決方案: UIViewController -viewDidLoad not being called

+0

我的viewDidLoad被調用,但它沒有正確推送視圖,其加載一個空白的視圖.... NSLogging導航控制器還顯示它指向viewDidLoad方法中的UINavigationController – ucabdro

+0

的實例,是否將所有子視圖正確添加到視圖? – Maggie

1

除非你正在做的事情非常棘手,你應該在LoginViewController類調​​用alloc而不是變量。另外,如果你在Interface Builder設置LoginViewController(而不是編程方式),你需要從NIB加載它:

LoginViewController *lvc = [[[LoginViewController alloc] initWithNibName:nil bundle:nil] autorelease]; 
[self.navigationController pushViewController:lvc animated:NO]; 

已經在docs看看initWithNibName:bundle:

+0

我不認爲你說的是​​100%正確的。可以將文件的所有者類設置爲指向正確的視圖控制器。將文件的所有者視圖連接到筆尖中的View對象通常都是我必須做的,才能使其工作。我從來沒有嘗試在viewDidLoad方法中使用它,儘管...我認爲我的問題在於某處?! – ucabdro

+0

您可以設置文件的所有者對象的類,但據我所知,這只是因爲你可以訪問'IBOutlet'和類似的。我的理解是,您必須命名視圖控制器要使用的NIB; 'init'不會爲你做。文檔狀態:「如果您使用nib文件指定視圖,則必須使用'initWithNibName:bundle:'方法初始化您的視圖控制器對象。」 –

+0

文檔說,如果爲nib名稱傳遞了'nil',則它將查找與視圖控制器具有相同名稱的xib文件。 –

0

根據您的視圖控制器命名的性質來判斷,您的LoginViewController是您的UINavigationController的第一個視圖控制器嗎?

如果這是你想要做的,你應該使用LoginViewController作爲根控制器初始化你的導航控制器,而不是將它推到導航堆棧上。

的UINavigationController有一個方法來做到這一點:

- (id)initWithRootViewController:(UIViewController *)rootViewController 

編輯:

好了,你可以去了解它是這樣的一種方式。

在你的應用程序委託.h文件中,你應該已經聲明瞭一個UINavigationController。

@interface MyAppDelegate : NSObject <UIApplicationDelegate> 
{ 
    UINavigationController *navController; 
} 

@property (nonatomic, retain) UINavigationController *navController; 
@property (nonatomic, retain) IBOutlet UIWindow *window; 

@end 

在應用程序委託didFinishLaunching:withOption:你可以在那裏創建LoginViewController的實例,並用它來初始化你UINavigation控制器作爲根視圖控制器

#import "LoginViewController.h" 

@implementation MyAppDelegate 

@synthesize navController; 
@synthesize window = _window; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    LoginViewController *loginController = [[LoginViewController alloc] init]; 

    navController = [[UINavigationController alloc] initWithRootViewController:loginController]; 

    [loginController release]; 

    [[self window] setRootViewController:navController]; 

    [navController release]; 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 

我可能有一個錯字在這裏或那裏,但這是我會去做的一種方式。

+0

是的。但是我希望rootviewcontroller在應用程序加載後立即加載loginviecontroller。這怎麼可能? – ucabdro

+0

除了我上面的編輯之外,還有一個側面問題,你想要在導航控制器中使用Login View還是希望用戶首先看到登錄名,然後在登錄後將它們顯示在導航中的另一個視圖控制器中? – Zhang