2012-03-25 11 views
0

はコードです:http://min.us/mWdMO0n14コール別のクラスからメソッド揺れが検出されたときにHERE

私はOBJのCの初心者ですので、私はかなり検索しましたが、私を解決することができる何かを発見していません問題。

私はCalculatorViewController.hとの.m、その後CalculatorBrain.hのand.m(スタンフォード講義)CalculatorBrain.mで

が、私はCalculatorBrainにプライベートとして定義された変数のすべてに、次のメソッドを持っていますヘッダ。

- (void)clearEverythingOnShakeGesture{ 
    operand = 0; 
    waitingOperation = @""; 
    waitingOperand = 0; 
} 

CalculatorBrain.mでは、以下のように、私はすべての揺れを検出するように設定しました。私は、あなたが一般的なアイデアを持っているので、揺れ検出の上にいくつかのコードを含めました。

@interface CalculatorViewController() 
@property(nonatomic, retain) CalculatorBrain *brain; 
@end 

@implementation CalculatorViewController 

@synthesize brain; 
- (CalculatorBrain *)brain { 
    if (!brain) { 
     brain = [[CalculatorBrain alloc] init]; 
    } 
    return brain; 
} 

-(BOOL)canBecomeFirstResponder{ 
    return YES; 
} 

-(void)viewDidAppear: (BOOL) animated{ 
    [super viewDidAppear:animated]; 
    [self becomeFirstResponder]; 
} 

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { 
    if (event.subtype == UIEventSubtypeMotionShake) 
    { 
     NSLog(@"SHAKE IT!"); 
     [brain clearEverythingOnShakeGesture]; //********** not sure how to call this. 

    } 
} 

私はエラーが出るので、私は「クラスメソッドを+ clearEverythingOnShakeGesture見つからないデフォルトはid型を返すために、」[brain clearEverythingOnShakeGesture];を呼び出すするかどうかはわかりません。しかし、クラスメソッドにすると、内部の変数はインスタンス変数になり、別のエラーが発生します。どんな助けでも大歓迎です。

+0

2つの提案:1.メソッドを静的にします。 2. [self.brain clearEverythingOnShakeGesture]を使用します。 – David

+0

あなたは[self.brain clearEverythingOnShakeGesture]を試しましたか? ?どのような "脳"が何であるかについてのあいまいさを解消するために、私はこれを次のように合成するでしょう:@synthesize brain = _brain; 。 –

答えて

0

上記のコメントに投稿されたプロジェクトのAppDelegateは、ペン先から計算機ビューコントローラを構築してすぐに解放します。アプリは部分的に機能しますが、シェイクジェスチャで消去されるUILabelプロパティはその時点でゼロになります。

プライベートカテゴリでプライベートプロパティを宣言し、それらを_underscoreエイリアスで合成し、合成メソッド外でself.propertyとして参照することをお勧めします。

+0

ありがとうもう一度:) – Alex

0

CalculatorBrain.hをインポートしていますか?また、getterにCalculatorBrainを構築することで、怠惰な初期化パターンを使用していますが、あなたは、getBegin:メソッドでgetterを呼び出すことはありません。脳のインスタンスを取得するには[self.brain clearEverything ...]を試してください。

私はコンパイラにあなたがクラスメソッドを持っていると思うようにするコードに何も表示されません。それは神秘的です。ヘッダーのインポートについてもう一度確認してください。 clearEverything ...がインスタンスメソッドでなければならないということは間違いありません。

+0

私はあなたの言ったことをやったが、私はもはやエラーを取得しません。しかし、シミュレータでシェイクジェスチャを選択すると、電卓はそれ自体をクリアしません。私はclearEverythingOnShakeGestureメソッドが動作することを知っています。なぜなら、ボタンを使用して呼び出すと、正常に動作するからです。 – Alex

+0

あなたはmotionBeganを言っていますか?シェイクジェスチャーをシミュレートするときに呼び出されませんか?それがあった場合は、ログにSHAKE ITメッセージが表示されます。 http://stackoverflow.com/questions/150446/how-do-i-detect-when-someone-shakes-an-iphoneを参照して、コードの揺れを確認してください。 – danh

+0

ログにメッセージが表示されているので、揺れの動作を知っています。問題は、揺れが検出されたときに他に何も働かないことです。あなたがすぐにそれをテストしたいなら、ここにプロジェクトがあります。大変感謝しています。 http://min.us/mWdMO0n14 – Alex