UIButton的子类使用Interface Builder连接到父View Controller的IBAction?

时间:2014-05-08 21:28:21

标签: ios objective-c uibutton interface-builder

免责声明:我是Interface Builder的新手,所以我可能完全错误地使用它。

我创建了一个NavigationViewController,将两个ViewControllers附加到我的故事板上,然后将UIButton添加(拖动)到第一个VC上。

然后我在UIButton上创建了一个导航segue,它在两个VC之间导航。这可以按预期工作。

当事情崩溃时,当我尝试使用我创建的UIButton的自定义子类时:segue永远不会被触发。

  • 在我的UIButton属性检查器中,我将自定义类设置为我的自定义类名。
  • 我向UIButton添加了几个用户定义的运行时属性。

UIButton标题如下所示:

#import <UIKit/UIKit.h>

@interface RSButton : UIButton

@property (nonatomic) CGFloat touchAlpha;

@end

UIButton实现如下:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.adjustsImageWhenHighlighted = NO;
    self.highlighted = YES;
    [UIView transitionWithView:self
                      duration:0.04
                       options:UIViewAnimationOptionAllowUserInteraction
                    animations:^{
                        if (self.touchAlpha && self.touchAlpha < 1.0)
                        {
                            self.alpha = self.touchAlpha;
                        }
                    } completion:nil];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.highlighted = NO;
    [self resetToDefaultState];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.highlighted = NO;
    [self resetToDefaultState];
}

- (void)resetToDefaultState
{
    [UIView transitionWithView:self
                  duration:0.12
                   options:UIViewAnimationOptionAllowUserInteraction
                animations:^{
                    if (self.alpha < 1)
                    {
                        self.alpha = 1.0;
                    }
                } completion:nil];
}

有趣的是,我可以看到问题是什么:我已经覆盖了touchesBegan/touchesEnded事件,现在segue的东西没有被触发。

我无法弄清楚如何以编程方式触发附加的segue操作?

  • performSegueWithIdentifier无法在[self]
  • 上投放
  • [self performSelector:@selector(performSegueWithIdentifier:@"segueId" sender:self)];建议我在解雇之前知道segueId是什么。

1 个答案:

答案 0 :(得分:2)

在您的方法中,请致电:

[super touchesBegan:touches withEvent:event]

所以:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event]

    //Your code
}

或:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //Your code

    [super touchesBegan:touches withEvent:event]
}

在touchEnded等中执行相同操作。

重要: 当您覆盖重要和标准方法时,请务必使用superclasssuper上调用该方法。 它与您在子类上调用init时的操作相同:

- (id)init {
    self = [super init];
    if(self) {
        //your code
    }

    return self;
}