[英]objective-c delegates and events design (I don't get it)
我對Objective-C語言非常陌生(不到三個月),但這是我真正需要了解的東西。
假設有一個控制器(在iOS環境中)用於管理表視圖以從用戶輸入數據。 該表必須具有可編輯的單元格和某些功能,以使值的選擇更加容易,例如,一個按鈕顯示帶有字段可能值的彈出框。
假設有一個存儲國家名稱的字段。 彈出窗口首先顯示大洲列表; 當用戶選擇一個洲時,彈出框的控制器必須顯示預覽中所選國家的國家/地區。
現在,此彈出窗口出現在應用程序的許多位置,因此,如果我可以將其封裝起來以備后用,那將是很好的。 我對這種彈出窗口的期望是這樣的:
...
@protocol MyPopoverDelegate<NSObject> {
-(void)didSelectCountry:(NSString *)countryName;
{
...
MyPopoverController *dataSelector = [[MyPopoverController] alloc] init];
dataSelector.dataType = CountryDataType;
dataSelector.delegate = self;
[dataSelector show];
[dataSelector release];
...
這里的問題是[dataSelector release]
因為用於管理彈出窗口的代碼必須一直有效,直到選擇了國家為止。 這意味着dataSelector
變量必須是調用者類的屬性,並且很糟糕。
然后的問題是:如何組織這種情況以擁有可重用的控制器?
謝謝
vodkhang編輯后的答案:
好的,這很不錯,但是dataSelector
仍然是一個屬性。 如果我怎么辦:
@implementation MyPopoverController
- (id)init {
...
[self retain];
...
}
- (void)popoverControllerDidDismissPopover: (UIPopoverController *)popoverController {
...
[delegate didFinishSelectingCountry:countryName];
[self release];
}
@end
我從沒有在Objective-C中看到這種行為,我覺得這不是主意。 為什么錯了?
您可以為委托方法做的一種方法是:
MyPopOverDelegate
- (void)didFinishSelectingCountry:(NSString *)countryName popOver:(MyPopOver *)popOver;
Caller.m
// the caller
- (void)viewDidLoad {
MyPopoverController *dataSelector = [[MyPopoverController] alloc] init];
dataSelector.dataType = CountryDataType;
dataSelector.delegate = self;
[dataSelector show];
}
- (void)didFinishSelectingCountry:(NSString *)countryName popOver:(MyPopOver *)popOver {
// finish stuff
[popOver release];
}
這種方式非常類似於NSUrlConnection,UIImagePickerController
如果您希望某個獨特的對象可以在視圖層次結構中的任何位置在整個應用程序中重用,則可以使其成為應用程序委托的屬性,並讓應用程序委托擁有它(在活動時保留它,在出現內存警告時釋放它,等等)。 )。
如果將代碼移植到垃圾回收環境,則自保留對象最終可能會遇到問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.