4

UIBarButtonItemいくつかの特別な機能を追加するためにサブクラス化しようとしています。barButtonItemタッチしたときに外観を切り替える必要があるため、をオーバーライドしようとしていますperformSelector:

以下のコードを使用すると、EXC_BAD_ACCESS (code=2 ...)

-(id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2
{
    // Do something

    return [super performSelector:aSelector withObject:object1 withObject:object2];
}

私の推測では、誤ってオーバーライドしようとしているperformSelector:(別の方法はありますか?)か、のメソッドを誤って呼び出していsuperます。

3時間以上解決策を探した後、何も見つかりませんでした。どんな助けでも大歓迎です。

更新: 次の作品:

@implementation CustomBarButtonItem

- (void)setTarget:(id)target
{
    _realTarget = target;
    super.target = self;
}

- (void)setAction:(SEL)action
{
    _realAction = action;
    super.action = @selector(pressed);
}

- (void)pressed
{
    [self doCustom]; // implement this somewhere
    [_realTarget performSelector:_realAction withObject:nil afterDelay:0];
}

残念ながら、たまにしか機能しない設定でcustomView、通常の外観と通常の外観を切り替えたいと思いました。しかし、それはまったく別の問題です。皆さんありがとう。UIBarButtonItemself.customView = nil

より良い解決策があるかどうかを確認するために、もう少し待ってベストアンサーを選択します。

4

3 に答える 3

4

おそらくUIView、任意の方法で簡単に変更できる単純なものを使用して、この機能を実装する方がよいでしょう。

UIBarButtonItemカスタムUIViewに基づいて初期化する方法を提供します。

- (id)initWithCustomView:(UIView *)customView

UIView次に、によって発生したタッチイベントに基づいて外観を変更するように指示できますUIBarButtonItem

于 2012-12-30T12:42:58.683 に答える
2

オーバーライドperformSelector:は間違いなく正しい方法ではありません。このクラスはperformSelector:、Target-Action部分だけでなく、さまざまなことを行うために使用できます。

performSelector残念ながら、forthetargetアクションが実行される前に実行されているパブリックメソッドはありません。

ただし、View ControllerでTarget-Actionを使用してアクションを実装することも、プライベートメソッドをオーバーライドすることもできます。

また、「特別な機能」の意味を理解しておくと役に立ちます。

于 2012-12-30T12:37:21.650 に答える
1

私は次のことをします:

  1. アップ/ダウンハンドラーを追加します

    CAGradientLayer *gradient = [CAGradientLayer layer];
    loginButton.clipsToBounds = YES;
    UIColor *topColor = [UIColor colorWithRed:255/255 green:255/255 blue:255/255 alpha:0.9];
    UIColor *middleColor = [UIColor colorWithRed:61.0/255 green:130.0/255 blue:244.0/255 alpha:1.0];
    UIColor *bottomColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
    gradient.colors = [NSArray arrayWithObjects:(id)topColor.CGColor,
                       (id)middleColor.CGColor, (id)bottomColor.CGColor, nil];
    gradient.locations = [NSArray arrayWithObjects:
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:0.05f],
                          [NSNumber numberWithFloat:0.7],
                          nil];
    gradient.frame = [[loginButton layer] bounds];
    gradient.cornerRadius = 4.0;
    gradient.borderWidth = 0.5;
    [loginButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [loginButton.layer insertSublayer:gradient atIndex:0]; 
    [loginButton addTarget:self action:@selector(loginTouchDown:)
                    forControlEvents:UIControlEventTouchDown];
    [loginButton addTarget:self action:@selector(loginTouchUp:)
                  forControlEvents:UIControlEventTouchUpOutside];
    
  2. ハンドラーでは、グラデーションレイヤーまたは単純なレイヤー(前に準備)を使用して、外観について必要なことを行います。

    - (IBAction)loginTouchDown:(id)sender
    {
            CAGradientLayer *gradient = [loginButton.layer.sublayers objectAtIndex:0];
            UIColor *topColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
            UIColor *middleColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
            UIColor *bottomColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
            gradient.colors = [NSArray arrayWithObjects:(id)topColor.CGColor, (id)middleColor.CGColor,
                               (id)bottomColor.CGColor, nil];
    }
    
    - (IBAction)loginTouchUp:(id)sender
    {
            CAGradientLayer *gradient = [loginButton.layer.sublayers objectAtIndex:0];
            UIColor *topColor = [UIColor colorWithRed:255/255 green:255/255 blue:255/255 alpha:0.9];
            UIColor *middleColor = [UIColor colorWithRed:61.0/255 green:130.0/255 blue:244.0/255 alpha:1.0];
            UIColor *bottomColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
            gradient.colors = [NSArray arrayWithObjects:(id)topColor.CGColor,
                               (id)middleColor.CGColor, (id)bottomColor.CGColor, nil];
    }
    
于 2012-12-30T22:34:30.063 に答える