委托引用自己

时间:2014-01-16 05:34:57

标签: ios objective-c delegates

我一直在开发一个自定义UIAlertView类来拥有一个完成块。委托引用是否可以?例如:

PYAreaAlertView.h

@interface PYAreatAlertView : UIAlertView

@property (nonatomic, copy) CompletionBlock completion;

- (id)initWithCompletion:(CompletionBlock)completion;

@end

PYAreaAlertView.m

@interface PYAreaAlertView () <UIAlertViewDelgate>

@end

@implementation PYAreaAlertView

- (id)initWithCompletion:(CompletionBlock)completion
{
    self = [super init];

    if (self)
    {
        _completion = completion

        self.title = @"Add Area"
        self.message = @"";
        self.delegate = self // Is this ok??
    }

    return self
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];

    if ([buttonTitle isEqualToString:@"Done"] && self.completion)
        self.completion();
}

4 个答案:

答案 0 :(得分:0)

这是完全合法的,因为您的类符合<UIAlertViewDelegate>协议。 这也是一个好主意,因为您可以将所有内容保留在内部,而不是将您的代表外包给另一个类。

但是,与此技术相反的是,它违反了模型 - 视图 - 控制器风格。让你的视图(UIView的子类)处理逻辑会打破MVC范式。您可以尝试创建一个名为MyAlertViewDelegate : NSObject <UIAlertViewDelegate>的新类,实例化它,然后将其指定为您的委托。这样可以通过分离模型和视图来保持MVC的完整性。

答案 1 :(得分:0)

self.delegate = self完全没问题,在子类化框架方法时非常常见。 delegate几乎总是一个弱引用,所以你没有得到循环引用。

答案 2 :(得分:0)

将委托设置为self here.有一个非常好的解释。实际上,委托就是你要发送消息的地方,所以如果这是你想要实现的目标,那就完全没问题。

答案 3 :(得分:0)

请注意,由于delegatePYAreatAlertView,您还会向您的班级用户公开UIAlertView媒体资源。因此,如果用户提供不同的delegate,则执行完成块的逻辑可能不起作用。

另外,请注意:建议UIAlertView不应该是子类。

From UIAlertView docs

  

UIAlertView类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。

在这种情况下,您最好创建自定义UIView并复制警报视图外观。在这里,您可以实现委派和/或完成块设计。

编辑:

理论上,委托是一个对象,当该对象遇到程序中的事件时,该对象代表另一个对象或与另一个对象协同工作。因此,当您将类的委托设置为self时,您将失去委托模式的目的。

希望有所帮助!