【问题标题】:Eliminate repetitive code for Delegation in Objective C消除 Objective C 中委托的重复代码
【发布时间】:2013-01-30 04:22:22
【问题描述】:

项目中的 35 个头文件之一(由其他开发者交给我;它们都包含相同的委托声明)

@interface ActivityDetailsCN : UIViewController <NSXMLParserDelegate,     
AccountStatusDelegate, AccountTypeDelegate, DirectionDelegate, RecipientDelegate,
PriorityDelegate, DurationDelegate, CurrencyDelegate, OppTypeDelegate,
OppCategoryDelegate, DatePickerDelegate, SalutationDelegate, DepartmentDelegate, 
LeadTypeDelegate, OwnershipDelegate, MailingDelegate, SourceDelegate, 
StateDelegate, CommentsDelegate, CityDelegate, ZipCodeDelegate> 
{
    //Declaration of iVars goes here...
}

这里声明的所有委托都包含相同的功能。甚至他们的定义也是如此。 这些委托中的每一个都在它们各自的ViewController 头文件之前声明如下:

@protocol AccountStatusDelegate <NSObject>
  - (void)cancelTapped;
  - (void)doneTapped;
  - (void)selectTapped:(NSString *)string;
@end

@interface AccountStatusVC : UIViewController <NSXMLParserDelegate> {
}
@property (unsafe_unretained) id <AccountStatusDelegate> delegate;

cancelTapped的实现:

- (void)cancelTapped {
    [objPopOver dismissPopoverAnimated:YES];
}

cancelTapped的实现:

- (void)doneTapped {
    [tblView reloadData];
    [objPopOver dismissPopoverAnimated:YES];
}

cancelTapped的实现:

- (void)selectTapped:(NSString *)string
{
    if ([string isEqualToString:@"US"])
        isTextField = FALSE;
    else if([string isEqualToString:@"Other"]) {
        appDelegate.strCountry = @"";
        isTextField = TRUE;
    }
    [tblView reloadData];
    [objPopOver dismissPopoverAnimated:YES];
}

现在,问题来了:我不想在每一堂课上都重复它(就像现在一样);我想以更清洁的方式制作,有没有可能的解决方案?

【问题讨论】:

    标签: ios objective-c oop protocols delegation


    【解决方案1】:

    在一个通用超类中实现委托方法,并将所有协议重构为一个通用 TapCallbackDelegate 协议

    【讨论】:

    • 问题是,这里没有任何通用的超类。甚至没有类层次结构。
    猜你喜欢
    • 2012-09-14
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多