0

一度に1つしか選択できないように、切り替えボタンのカスタム実装を実装しようとしています。を使用してオブジェクトを初期化するという奇妙なエラーが発生しました[[ajdSwitchButton alloc] init]。initでは、次のようにクラスプロパティを設定しますself.currentSelection = 2

問題はinit、メソッドの最初の呼び出しとの間IBActionで、値が0に変更されることです。理由がわかりません。関連するコードは次のとおりです。

ajdSwitchButton.h

#import <UIKit/UIKit.h>

@interface ajdSwitchButton : UIView

@property (nonatomic) NSInteger currentSelection;

// Button Outlets
@property (nonatomic, strong) IBOutlet UIButton *buttonOne;
@property (nonatomic, strong) IBOutlet UIButton *buttonTwo;

// Button Actions
- (IBAction)buttonPress:(id)sender;
- (IBAction)buttonPressTwo:(id)sender;

// Instance Methods
- (void)switchButtonState:(UIButton *)button;

@end

ajdSwitchButton.m

#import "ajdSwitchButton.h"

@implementation ajdSwitchButton

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        _currentSelection = 2;
    }
    return self;
}

// Handles button press actions for buttonOne
- (IBAction)buttonPress:(id)sender {
    NSLog(@"%@", self);
    // Y button pressed
    if (self.currentSelection == 2) {
        // No button is selected
        // Highlight and select buttonOne
        [self performSelector:@selector(switchButtonState:) withObject:self.buttonOne afterDelay:0.0];
    } else if (self.currentSelection == 1) {
        // No was previously selected
        // Unselect NO and select YES
        [self performSelector:@selector(switchButtonState:) withObject:self.buttonTwo afterDelay:0.0];
        [self performSelector:@selector(switchButtonState:) withObject:self.buttonOne afterDelay:0.0];
    } else {
    // Y button already pressed
    [self performSelector:@selector(switchButtonState:) withObject:self.buttonOne afterDelay:0.0];
    }
    self.currentSelection = 0;
}

- (IBAction)buttonPressTwo:(id)sender {
    // N button pressed
    NSLog(@"%i", self.currentSelection);
    if (self.currentSelection == 2) {
        // No button is selected
        // Highlight and select buttonOne
    [self performSelector:@selector(switchButtonState:) withObject:self.buttonTwo afterDelay:0.0];
} else if (self.currentSelection == 0) {
        // Yes was previously selected
        // Unselect YES and select NO
        [self performSelector:@selector(switchButtonState:) withObject:self.buttonTwo afterDelay:0.0];
        [self performSelector:@selector(switchButtonState:) withObject:self.buttonOne afterDelay:0.0];
    } else {
        // N button already pressed
        [self performSelector:@selector(switchButtonState:) withObject:self.buttonTwo afterDelay:0.0];
    }
    self.currentSelection = 1;
}

// Switches the look and state of the button
- (void)switchButtonState:(UIButton *)button {
    if (!button.selected) {
        button.highlighted = YES;
        button.selected = YES;
    } else {
        button.highlighted = NO;
        button.selected = NO;
    }
}
@end

ajdSwitchButtonのインスタンスを内のIBOutletビューにリンクしますViewController。どんな助けでも大歓迎です。

編集:メソッドが呼び出さinitれた直後とすぐにオブジェクトのメモリ値をチェックするために、いくつかのNSLogを貼り付けました。IBAction前後は次のとおりです。

<ajdSwitchButton: 0x746d2e0; frame = (0 0; 0 0); layer = <CALayer: 0x7472c40>>

<ajdSwitchButton: 0x7471b10; frame = (77 232; 180 83); autoresize = TM+BM; layer = <CALayer: 0x7471bf0>>

4

3 に答える 3

0

問題はあなた自身の質問にあります。

次の変数を初期化しています。

- (id)initWithFrame:(CGRect)frame
{
}

を使用してオブジェクトを作成していることはすでに説明しました[[ajdSwitchButton alloc] init]

呼び出しinitていないinitWithFrameので、変数が初期化されることはありません。したがって、次のような関数を実装します。

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code
        _currentSelection = 2;
    }
    return self;
}
于 2013-01-15T08:03:30.840 に答える
0

あなたはあなたのコードでそれをやっています...

それはばかげた間違いかもしれません、またはあなたはそれを必要とします..あなたのコードをチェックしてください:

- (IBAction)buttonPress:(id)sender {
    NSLog(@"%@", self);
    // Y button pressed
    if (self.currentSelection == 2) {
        // No button is selected
        // Highlight and select buttonOne
        [self performSelector:@selector(switchButtonState:) withObject:self.buttonOne afterDelay:0.0];
    } else if (self.currentSelection == 1) {
        // No was previously selected
        // Unselect NO and select YES
        [self performSelector:@selector(switchButtonState:) withObject:self.buttonTwo afterDelay:0.0];
        [self performSelector:@selector(switchButtonState:) withObject:self.buttonOne afterDelay:0.0];
    } else {
    // Y button already pressed
    [self performSelector:@selector(switchButtonState:) withObject:self.buttonOne afterDelay:0.0];
    }



    /*  SEE HERE */

    self.currentSelection = 0;
}
于 2013-01-15T06:50:57.770 に答える
0

IBOutletsはinitWithCoder:(NSCoder)aDecoderを介して初期化するため、このメソッドを実装する必要があります。

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code
        _currentSelection = 2;
    }
    return self;
}
于 2013-01-15T07:07:26.487 に答える