1

我對於Objective-C語言(少於三個月)很新穎,但它是我真正需要了解的東西。objective-c代表和事件設計(我不明白)

假設有一個控制器(在iOS環境中)管理用戶輸入數據的表視圖。該表必須具有可編輯單元格和某些功能,以便更輕鬆地進行值的選擇,例如,顯示帶有可能的字段值的彈出式窗口的按鈕。

假設有一個字段來存儲國家名稱。 popover首先顯示了大陸的列表;當用戶選擇一個大陸時,彈出窗口的控制器必須顯示所選大陸預覽的國家。

現在,這個彈出窗口出現在應用程序的許多地方,所以如果我可以封裝它以備後用,它將會很好。我會想到這個酥料餅是這樣的:

... 
@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這種行爲,我覺得這是沒有的想法。 爲什麼它錯了?

+0

可能的答案:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/AboutViewControllers/AboutViewControllers.html中的「關於自定義視圖控制器」部分 – 2010-10-03 15:53:46

回答

1

一個你可以委託方法做的方式是有:

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

0

如果你想在整個應用中的一些獨特的對象可重複使用從視圖層次結構中的任何位置,您都可以將其設置爲應用程序委託的屬性,並讓應用程序委託擁有它(在實時保留它,在內存警告期間釋放它等)。

如果您將代碼移植到垃圾回收環境中,自我保留的對象最終可能會遇到問題。