2010-06-25 51 views
4

我有一個使用表視圖作爲界面的iphone應用程序。每次用戶點擊其中一個表格單元格時,我想向用戶顯示另一個窗口。然而,我推入導航控制器的窗口的用戶界面非常相似。因此,我決定在通用nib文件的文件所有者的所有子類中使用「通用nib文件」。如何在xcode中使用相同的nib文件創建多個窗口

然而,我很困惑(和什麼不工作)是我似乎無法自定義此通用筆尖文件。我已經在文件的初始化此代碼:

在.h文件:

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

@interface subclass1 : primeViewController { //subclassing from a generic view controller that owns a generic nib file 

} 

在.m文件:

#import "subclass1.h" 

@implementation subclass1 

- (id) initWithLabelAndButton { 
    if(self = [super initWithNibName:@"primeViewController" bundle:nil]) { 
     self.label.text = @"Title of the first subclass"; 

    } 
    return self; 
} 

但是當我實例化類的表視圖:

//somewhere in rootviewcontroller.m: 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    switch (indexPath.row) { 
     case 0: 
     { 
      checkPrime* checkPrimeViewController = [[checkPrime alloc] initWithLabelAndButton]; 
      [self.navigationController pushViewController:checkPrimeViewController animated:YES]; 
      [checkPrimeViewController release]; 
      break; 
     } 
     default: 
      break; 
    } 
} 

所以有誰能告訴我我做錯了什麼?或者我錯了,假設xcode允許我在其子類中多次使用nib文件?我不明白爲什麼我不能做到這一點,但我不知道如何...

+1

你還沒有真正說過什麼不起作用。 – Gary 2010-06-25 12:35:13

+0

你是什麼意思的多個窗口。在iOS應用程序中,只能有一個窗口。 – iPrabu 2010-11-26 12:19:35

+0

我的意思是說我想用一個XIB文件來創建許多類。所以,當我想要把另一扇窗我的ViewController,我可以有一個模板,廈門國際銀行,我可以從 – 2010-11-26 12:41:38

回答

4

當加載nib文件時,它創建視圖控制器完全相同的類,寫在.xib( UIViewController或PrimeViewController)。實際上保存在.nib文件中的是什麼? 如果您將UIView和所有相應的對象存儲在xib中,並且只會通過使用[[NSBundle mainBundle] loadNibNamed:@「YourNibFile」所有者:class1ViewController選項:nil)加載它們,而在nib中的視圖已連接到相應的文件所有者出口。

+0

阿工作..好了,我們實際上可以設置XIB文件編程這樣的老闆?另一個問題是,如果我們以編程方式設置所有者,並且所有者擁有IBOutlets,它們是否會被正確設置? (嗯,我想這只是意味着,如果我們有一些類實例化,我們必須確保該類具有所有IBOutlets ..我說得對不對?) – 2010-11-30 13:12:44

+1

我的理解是,IBOutlets只是暗示的代碼,以幫助界面生成器知道你想作爲網點對待什麼。缺少它們不會損害你的代碼(缺少網點本身,但這是另一回事)。 [http://www.cocoadev.com/index.pl?IBOutlet] – paulbailey 2010-12-01 13:56:23

+0

好吧,這聽起來沒問題。我沒有時間來測試它。 – 2010-12-03 10:43:47

2

如果將所有視圖放在一個NIB中,那麼當您的應用程序啓動時,它必須將整個NIB加載到內存中,併爲所有控件構造所有對象,這需要很長時間。

如果您將視圖分爲單獨的NIB,那麼您的應用啓動速度會快得多,因爲只有包含初始視圖的NIB纔會加載。然後,當視圖改變時,您可以加載包含新視圖的NIB。這會在第一次打開視圖時招致輕微的麻煩。

此外,如果你想優化內存使用情況,您可以切換到視圖時卸載了寶貴的觀點

0

我建議子類的UITableViewController並添加任何方法,實例變量和屬性共同您的不同在這裏查看。製作你的筆尖,讓它有一個對這些對象之一的實例的引用。

然後,繼承你的子類,以獲得個性化的功能,如

GenericSubclassVC* checkPrimeViewController = [[SpecificSubclassVC alloc] initWithNibName:@"GenericNib" and Bundle:nil]; 
[self.navigationController pushViewController:checkPrimeViewController animated:YES]; 

你應該堅持重寫指定初始化。根據是否需要修改UIView對象,將任何自定義初始化代碼放入awakeFromNib或viewDidLoad方法中。

但是,正如其他人所說,它不是非常有效或優雅。如果所有ViewController都是表視圖控制器,並且要顯示相同的數據模型,那麼還有其他方法可以重用代碼,例如定義數據源對象。