簡體   English   中英

如何使用Interface Builder創建帶有UINavigationController的UIViewController?

[英]How to create an UIViewController with UINavigationController with Interface Builder?

在我的iOS應用程序中,我想提供一個設置視圖。 “presentModalViewController”非常有效:

ViewSettings *controller = [[ViewSettings alloc] initWithNibName:@"ViewSettings" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self.navigationController presentModalViewController:navController animated:YES];      
[controller release];
[navController release];

不幸的是,我必須更改我的運行代碼並創建ViewSettings,包括Interface Builder中的UINavigationController。 為什么? 長話故事,我會在這篇帖子的最后解釋一下......

我嘗試在我的ViewSettings中拖放UINavigationController並創建一個IBOutlet來在我的類中訪問它。 我把這個控制器給“presentModalViewController”,但應用程序崩潰了......

我做錯了什么?


[編輯]

錯誤消息: GDB:程序接收信號:“SIGABRT”。
錯誤發生在此代碼的最后一行:

ViewSettings *viewSettings = [[ViewSettings alloc] initWithNibName:@"ViewSettings" bundle:nil];
UINavigationController *navController = viewSettings.navigationController;
UINavigationBar *navBar = navController.navigationBar;
OwnNavigationBar *ownNavBar = (OwnNavigationBar *)navBar;
[ownNavBar drawHeaderImage:YES];
[self.navigationController presentModalViewController:navController animated:YES];

詳細錯誤: 由於未捕獲的異常'NSInvalidArgumentException'而終止應用程序,原因:'應用程序試圖在目標上顯示一個nil模態視圖控制器。

[/編輯]


[EDIT2]
謝謝你的幫助! 是的,navigationController是nil ...我想我以錯誤的方式添加UINavigationController ...我把它放在這個窗口中,因為它不可能直接放在我的視圖中: 替代文字
如何正確添加UINavigationController?
[/ EDIT2]


PS:為什么我要使用IB? (你可以跳過這個...)

我需要在UINavigationBar中使用背景圖像。 我的第一次嘗試是:

UIImage *image = [UIImage imageNamed: @"header.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.navigationController.navigationBar addSubview:imageView];
[self.navigationController.navigationBar sendSubviewToBack:imageView];

但在某些問題上,UIBarButton的標題是不可見的! 我嘗試了很多,例如在每個視圖中設置視圖的“標記”和sendSubviewToBack,但沒有成功。 這是一個非常討厭的bug!

我的第二次嘗試是創建一個類別並覆蓋drawRect方法:

@implementation UINavigationBar(MyNavigationBar)
- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed: @"header.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end

但現在,我的所有UINavigationBars都有背景圖片,我無法停用它。 問題是,“ViewSettings”需要背景圖像,但以下推送視圖不需要。

遺憾的是,無法在類別中設置屬性或調用[super drawRect:rect]以避免繪制圖像。

我的最后一次嘗試是編寫自己的UINavigationBar

@interface OwnNavigationBar : UINavigationBar {
    BOOL _drawHeaderImage;
}

現在我可以控制drawRect方法!! 大!!

- (void)drawRect:(CGRect)rect {
    if (_drawHeaderImage) {
        UIImage *image = [UIImage imageNamed: @"header.png"];
        [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    }
    else {
        [super drawRect: rect];
    }
}

但我很早就慶祝...... :-(在UINavigationController中設置自己的UINavigationBar是不可能的!UINavigationController中的“navigationBar”是一個只讀屬性!AAAAHHHHHHHHHH!

我有最后一次機會:在Interface Builder中,可以為UINavigationController提供一個自己的UINavigationBar! 是! 我知道了!! :-)

我在我的MainWindow_iPhone.xib中配置它,效果很好! 現在,我必須為我的ViewSettings實現這個,因為這個(模態)視圖需要一個新的UINavigationController。

PS:也許,有人可以將此線程發送給Apple,這一切都非常煩人的情況和錯誤:-(

如果你要顯示你的nib文件的內容會很有幫助,因為我懷疑viewSettings.navigationController是nil。 navigationController是所有UIViewControllers的屬性,它為您提供父導航視圖控制器(如果存在)。 聽起來你從未將viewSettings視圖控制器添加到導航控制器的視圖控制器堆棧中。

從nib初始化視圖控制器時,它實際上並不會立即加載nib,因此viewSettings.navigationController仍為零。 第一次引用view屬性時,將加載nib。

更新

您可以自己加載筆尖並抓住導航控制器,如下所示:

UINavigationController *navController = [[[NSBundle mainBundle] loadNibNamed:@"ViewSettings" owner:self options:nil] objectAtIndex:1];

我在索引1使用了對象,因為在你的截圖中有一個tableview,我認為它將是索引0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM