从类别向UIButton添加目标

时间:2014-06-11 19:12:04

标签: ios objective-c

我实现了一个创建自定义UIAlertView的功能。我已将UIView扩展为category,并且我正在创建我的方法,名为

- (void)showCustomAlertWithTitle:(NSString *)title andMessage:(NSString *)message

我想在自定义alertview中的按钮中添加一个选择器,但是这个选择器包含在我的UIViewController中。我应该将选择器移动到类别中,还是以某种方式在viewcontroller中引用它?如果我将选择器移到类别中,我将无法访问navigationcontroller ...

UIView + Category.m:

中的

- (void)showCustomAlertWithTitle:(NSString *)title andMessage:(NSString *)message 
{
    UIView *alert = [[UIView alloc] initWithFrame:CGRectMake((self.frame.size.width/2)-100, (self.frame.size.height/2)-50, 200, 100)];
    UIButton *confirmButton = [[UIButton alloc] initWithFrame:CGRectMake(30,40, 50, 50)];
    [confirmButton addTarget:self action:@selector(delete:) forControlEvents:UIControlEventTouchUpInside]; 
    [alert addSubview:confirmButton];
    [self addSubview:alert];
}
MyViewController.m

中的

选择器方法

- (IBAction)delete:(id)sender 
{
     [[self.view viewWithTag:-7] removeFromSuperview];
     self.navigationController.navigationBar.hidden = NO;
} 

2 个答案:

答案 0 :(得分:1)

您正在迎合类别的限制。您无法将实例变量添加到类别中的类中,因此您没有一种干净的方法来保存指向您的呈现视图控制器的指针。

我建议在您的类别中添加新方法:

- (void) addButtonWithTitle: (NSString*) title 
  target: (id) target 
  action: (SEL) action 
  forControlEvents: (UIControlEvents)controlEvents;

然后在该方法的实现中,使用传入的参数来创建和配置按钮。该方法包括目标,选择器和应触发操作的事件列表。

答案 1 :(得分:0)

选择器应该在viewController中实现,因为您可以在不同的viewControllers中使用alertView。因此,有时您需要执行特定于该viewController的逻辑。此外,MVC 101禁止您尝试在UIView子类中实现操作。因此,viewController应该再次实现该操作。