1

私は非常に単純なサブクラスを持っていますUIViewController

@interface RoastChickenViewController : UIViewController {
    IBOutlet UISlider *weightSlider;    
}

@property (nonatomic,retain) UILabel *cookingTimeLabel;
- (void) weightValueHasChanged:(id)sender;
@end

私のxibファイルは、RoastChickenViewControllerファイルの所有者タイプであるように設定されており、weightSliderが接続されており、「valueChanged」アクションがに接続されていweightValuHasChanged:ます。

スライダー(シミュレーターまたはデバイス)に触れるとすぐに問題が発生します。

2010-08-21 20:26:07.688 CookIt1[26682:207] -[NSCFString weightValueHasChanged:]: unrecognized selector sent to instance 0x59215e0
2010-08-21 20:26:07.690 CookIt1[26682:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString weightValueHasChanged:]: unrecognized selector sent to instance 0x59215e0'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02395919 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x024e35de objc_exception_throw + 47
    2   CoreFoundation                      0x0239742b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x02307116 ___forwarding___ + 966
    4   CoreFoundation                      0x02306cd2 _CF_forwarding_prep_0 + 50
    5   UIKit                               0x002b9e14 -[UIApplication sendAction:to:from:forEvent:] + 119
    6   UIKit                               0x003436c8 -[UIControl sendAction:to:forEvent:] + 67
    7   UIKit                               0x00345b4a -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
    8   UIKit                               0x003c23ac -[UISlider beginTrackingWithTouch:withEvent:] + 731

少し歴史がありますが、実際には、UIViewを直接サブクラス化して使用してこれを機能させました。UIViewからUIViewControllerに変換することで、なんとかそれを破ることができました。これは、このような単純な動作を実装するためのより自然な方法だと思います。

明らかに私が欠けているものがあるので、私が適用できるある種のチェックリストはありますか?

4

2 に答える 2

1

NSCFStringでweightValueHasChangedを呼び出しているように見えます。これはほぼ間違いなくあなたが望むものではありません!IBの接続が切断されているか、weightValueHasChangedをNSCFStringのインスタンスに明示的に送信しています。

于 2010-08-21T19:34:40.573 に答える
1

この種のエラー(メッセージを受信するオブジェクトのタイプが予想とは完全に異なる場合)は、何らかの理由で受信者オブジェクトの割り当てが解除され、メモリ内のそのアドレスが他のオブジェクトで占有されている場合によく発生します。

したがって、コントローラのメモリ管理ですべてが正しいかどうかを確認する必要があります。

于 2010-08-21T20:13:04.867 に答える