2009-06-07 55 views
4

我已經創建了一個自定義的UIView,我想在我的iPhone應用程序中的多個不同的視圖控制器上使用。目前,我已經複製了包含來自第一個視圖控制器的nib文件的控件的UIView,將其粘貼到其他視圖控制器中,然後將所有動作連接到每個視圖控制器。這工作正常,但不是我想要使用此自定義視圖的最佳方式。從多個視圖控制器使用自定義UIView

我的自定義視圖非常簡單,它由一些帶有標籤的UIButton組成,並點擊這些按鈕觸發更改視圖控制器視圖上控件內容的操作。

什麼是一個策略來鞏固這個UIView的定義和用法?理想情況下,我只想從視圖控制器的筆尖引用此自定義視圖,並讓視圖控制器響應此自定義視圖中的操作。

編輯:好的,根據J.Biard的建議,我嘗試了以下運氣不多。

我創建了另一個基於UIView的nib文件,其中包含我的可重用視圖和UIView子類.m和.h文件的內容(現在只是一些UIButton對象),然後將nib File的Owner類設置爲我新創建的類名。

然後,我添加了來自J.Biard的大部分代碼(我將rect更改爲50,50,100,100,現在將setDelegate省略了,因爲我現在只是試圖讓它工作,並且我發現[self.view addSubview:view]比[self addSubView:view])工作得更好,直到應用程序啓動時顯示的第一個視圖控制器的viewDidLoad方法結束。

我現在得到的是我的主視圖,裏面有一個黑色方塊。我是否錯過了某個插座,或者在UIView子類的initWithFrame或drawRect中是否需要初始化?

回答

3

如果它非常簡單,我建議您在代碼中創建UIView的子類並創建此類的實例(或者您可以使用Interface Builder創建自定義UIView,然後將其存檔到NIB文件中並在稍後恢復也使用代碼)。

使用代碼的解決方案,你可以通過調用類似建立在你的控制器自定義的UIView的實例:

#import "MyCustomView.h" 

// let the superview decide how big it should be or set it as needed. 
CGRect sizeRect = CGRectMake(0,0,0,0); 

// create an instance of your view 
MyCustomView *view = [MyCustomView alloc] initWithFrame:sizeRect]; 

// set a custom delegate on the view or set callback methods using @selector()... 
[view setDelegate:self]; // self = view controller 

// add the view to the controller somewhere... (eg: update CGRect above as needed) 
[self addSubView:view]; 

// don't forget to release the view somewhere ;-) 

這個例子假定您創建一個委託協議,您的視圖控制器可以響應或者您也可以使用@selector動態連接事件。如果你不想在代碼中創建視圖的實例,你可以在你的NIB文件中添加一個「UIView」,並在巡視窗口中設置它的類類型(命令 - > 4 - > class下拉菜單)。 (NSArray *)loadNibNamed:(NSString *)名稱所有者:(id)所有者選項:(NSDictionary *)選項「如果您想在界面構建器中完成所有工作,您可以創建自定義UIView並使用類似於」 (請參閱NSBundle)動態加載NIB文件。儘管它也是可行的,但這表現出它自己的挑戰。

最涉及的選項是創建自己的xcode自定義UI庫/插件,以便像Apple提供的任何其他控件一樣將自定義控件/視圖從庫窗口拖動到每個NIB文件中。

希望能夠澄清或消除爲您重新使用控件的某些選項。

Cheers-

5

創建MyCustomView類和nib文件。

在nib文件中,將文件所有者設置爲MyCustomView - 然後像平常一樣設計視圖,並使用頂級UIView。在MyCustomView中創建一個IBOutlet,以鏈接到您的筆尖文件中的頂級UIView。

在MyCustomView添加這個方法:

- (BOOL) loadMyNibFile { 
if (![[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil]) { 
    return NO; 
} 
return YES; 
} 

在您的視圖控制器,你可以使用像這樣

- (void)viewDidLoad { 

MyCustomView *customView = [[MyCustomView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
[customView loadMyNibFile]; 
[self.view addSubview:customView.view]; //customView.view is the IBOutlet you created 
    [customView release]; 

} 

這個自定義視圖,您還可以創建MyCustomView一個方便的類方法,如果要做到這一點你喜歡的。

+0

如果您想通過使用Interface Builder來完成最後一部分(而不是在您的控制器中以編程方式設置customView),該怎麼辦?這可能嗎?你會如何做到這一點? – Greg 2011-07-13 20:35:26

相關問題