繁体   English   中英

Objective-C的代表和事件设计(我不明白)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM