【问题标题】:objective-c delegates and events design (I don't get it)objective-c 代表和事件设计(我不明白)
【发布时间】:2010-10-02 15:38:14
【问题描述】:

我对 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 中看到过这种行为,我觉得这不是想法。 为什么错了?

【问题讨论】:

标签: iphone objective-c model-view-controller design-patterns ipad


【解决方案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

【讨论】:

    【解决方案2】:

    如果您希望某个独特的对象可从视图层次结构中的任何位置在整个应用程序中重用,您可以将其设置为应用程序委托的属性,并让应用程序委托拥有它(在活动时保留它,在内存警告期间释放它等)。

    如果您将代码移植到垃圾收集环境,自保留对象最终可能会遇到问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多