2011-02-05 20 views
4

假設我有一個UIView,我想在多個視圖控制器中重用,因爲它是一個相當普通的具有高可用性值的UIView對象(如UITextFieldUISegmentedControl對象)。根據我的理解,如果我在代碼中編寫UIView,而不是使用Interface Builder製作XIB,重用此UIView會容易得多。我已經達到了這個結論,因爲如果UIView的是寫在代碼的話,我可以簡單地在任意視圖控制器初始化的UIView的一個新實例:重新使用基於代碼的UIViews與XIBs相比

MyGreatReusableView *greatReusableView = [[MyGreatReusableView alloc] initWithFrame:CGRectMake(...)]; 

...然後直接訪問的UIView的屬性和特性,就像使用股票UIView控件(例如UITextField)與它的.text,.textColor等屬性一樣。但是,如果我創建UIView作爲XIB,那麼它必須通過文件所有者或XIB中的View對象上的IBOutlet綁定到特定的視圖控制器,因此只能用於視圖控制器。此外,我只能使用連接到該視圖控制器的IBOutlets訪問XIB上的控件的屬性。

我在想,我完全誤解了一些關於XIB文件的問題,因爲這看起來確實是一個限制!如果有人能夠澄清是否有可能在多個視圖控制器中重新使用XIB文件,並且如果是這樣,請提供一個基於代碼的解決方案與基於XIB的解決方案的示例,我將非常感激。

在此先感謝您的幫助!

回答

1

確實有可能在多個視圖控制器中使用相同的視圖。你在正確的軌道上。關鍵是你不必使用視圖綁定到的視圖控制器。以下是我對重複使用的表格單元格(即含有像滑塊的東西)

  1. 創建一個新的XIB文件
  2. 創建一個新的視圖(對我來說,這是一個表格單元格)
  3. 集做所述UIViewController.view是視圖(再次,表格單元格)
  4. 我與此代碼(目前生產中使用的)鉤它:
     
    
    @implementation TableCellFactory 
    +(UITableViewCell*) createCellInstanceFromXIBName:(NSString*)name { 
         UIViewController* tmp = [[UIViewController alloc] initWithNibName:name bundle:nil]; 
         UITableViewCell* cell = (UITableViewCell*)[tmp view]; 
         DebugAssert([[cell class] isSubclassOfClass:[UITableViewCell class]], @"XIB view cell is not a subclass of UITableViewCell; xib name:%@",name); 
         DebugAssert(cell != nil,@"cell is nil -- Xib name:%@",name); 
         [cell retain]; 
         [tmp release]; 
         return cell; 
    } 
    @end 
     
    
+0

感謝您的留言。我是否正確創建了一個視圖控制器,然後將該控制器上的視圖出口純粹設置爲XIB視圖,以便您可以訪問代碼中的視圖控制器.view屬性?換句話說,視圖控制器本身什麼都不做?我只是擔心,這似乎不是一個非常優雅或有效的解決方案,因爲在代碼中創建UIView意味着我可以直接初始化UIView,而不必經歷使用UIViewController的開銷。 – Skoota 2011-02-06 10:17:49

2

另一種解決方案,而不需要設置可重複使用視圖的IBOutlets,只需將您想要使用的子視圖分配給特定的標記即可。然後你可以用標籤獲得視圖。

例如,當您想創建一個帶有標籤和文本字段的視圖時。這樣做的過程將是:

  1. 創建一個空的廈門國際銀行
  2. 設置有一個標籤和一個文本字段作爲一個子視圖的視圖。
  3. 分配標籤和文本字段不同的標籤(比如說10和11)

  4. 這個廈門國際銀行的標籤
    #define kReusableViewNibName @"ReusableViewNibName"
    #define kLabelTag 10
    #define kTextFieldTag 11

  5. 創建一個頭文件,定義宏
  6. 您現在可以在任何您想要的視圖控制器中加載xib:


// Import header file with previous defines 

NSArray *rootViewsFromXib = [[NSBundle mainBundle] loadNibNamed:@"NameOfXib" 
                  owner:nil 
                 options:nil]; 

// There is only one root view in the xib, 
// the view that contains the label and text field 
UIView *loadedView = [rootViewsFromXib objectAtIndex:0]; 

// You can now use the views from within the xib 
// by using the tags to obtain the views. 
UILabel *label = (UILabel *)[loadedView viewWithTag:kLabelTag]; 
UITextField *textField = (UITextField *)[loadedView viewWithTag:kTextFieldTag];