Apollo
Apollo

Reputation: 9064

Adding target to UIButton from category

I'm implementing a function to create a custom UIAlertView. I have extended UIView with a category, and I'm creating my method, called

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

I want to add a selector to a button inside my custom alertview, but this selector is contained in my UIViewController. Should I move the selector into the category, or somehow reference it in the viewcontroller? And If I move the selector into the category, I won't be able to access the navigationcontroller...

in 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];
}

selector method in MyViewController.m

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

Upvotes: 0

Views: 187

Answers (2)

NavinDev
NavinDev

Reputation: 995

The selector should be implemented in your viewController , since you could be using your alertView in different viewControllers. Therefore sometimes you would need to perform a logic specific to that viewController. Also MVC 101 forbids you from trying to implement an action in a UIView subclass. Therefore again your viewController should implement the action.

Upvotes: 0

Duncan C
Duncan C

Reputation: 131501

You are bumping up against the limitations of categories. You can't add instance variables to a class in a category, so you don't have a clean way to save a pointer to your presenting view controller.

I would suggest adding a new method to your category:

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

Then in the implementation of that method, use the parameters that are passed in to create and configure the button. The method includes a target, selector, and list of events that should trigger the action.

Upvotes: 1

Related Questions