2012-01-15 21 views
0

私はUITableViewCellに2 UIButtonのインスタンスを持っています。どちらのボタンにもデフォルト画像があります。 「不良」ボタンだけが無効状態の画像を有する。これ以上何もない。 不思議なUIButtonクラッシュ

はセルクラスでは、これらの2つのボタンがIBOutletキーワードとプロパティとして宣言されている:.xib 2つのボタンとクラスのプロパティ間

@property (nonatomic, readonly) IBOutlet UIButton* buttonCall; 
@property (nonatomic, readonly) IBOutlet UIButton* buttonGPS; 

接続がなされます。だから、

、.xibは以下が行われているロードされます。

MyCell* cell = (MyCell*)[tableView dequeueReusableCellWithIdentifier:cellID]; 
if (nil == cell) 
{ 
    NSArray* nibContents = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil]; 
    cell = [nibContents objectAtIndex:0]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
} 

// gps button 
[cell.buttonGPS setTitle:[NSString stringWithFormat:@"%d", indexPath.row] forState:UIControlStateNormal]; 
[cell.buttonGPS addTarget:self action:@selector(actionGPS:) forControlEvents:UIControlEventTouchUpInside]; 

if (...condition...) 
{ 
    cell.buttonCall.enabled = NO; 
    [cell.buttonCall removeTarget:self action:@selector(actionCall:) forControlEvents:UIControlEventTouchUpInside]; 
} 
else 
{ 
    cell.buttonCall.enabled = YES; 
    [cell.buttonCall setTitle:[...TheTitleString...] forState:UIControlStateNormal]; 
    [cell.buttonCall addTarget:self action:@selector(actionCall:) forControlEvents:UIControlEventTouchUpInside]; 
} 

ビューコントローラは、それが(UITableViewCell*)tableView:cellForRowAtIndexPath:を通じて首尾必要な回数を行く表示されたら。そして、アプリは、以下のスタックでクラッシュ:

0 kill 
... 
[UIButton imageRectForContentRect:] 
[UIButton(UIButtonInternal) _setupImageView] 
[UIButton layoutSubviews] 
... 
start 

私は、ボタンの画像を削除し、スタックでクラッシュし始めた:私は、ボタンのためにいくつかの識別ラベルを追加

0 kill 
... 
[UIButton layoutSubviews] 
... 
start 

- まだクラッシュ。

「悪い」ボタンのXCode-InterfaceBuilder接続が削除され、クラッシュが停止しました。しかし、ボタンは機能しません。

クラッシュの原因は何ですか?

コールスタックは次のとおりです。

0 CoreFoundation      0x013d406e __exceptionPreprocess + 206 
1 libobjc.A.dylib      0x019f0d0a objc_exception_throw + 44 
2 CoreFoundation      0x013d5ced -[NSObject doesNotRecognizeSelector:] + 253 
3 CoreFoundation      0x0133af00 ___forwarding___ + 432 
4 CoreFoundation      0x0133ace2 _CF_forwarding_prep_0 + 50 
5 UIKit        0x0086de3a -[UIButton imageRectForContentRect:] + 350 
6 UIKit        0x0086ed5b -[UIButton(UIButtonInternal) _setupImageView] + 158 
7 UIKit        0x0086e5f8 -[UIButton layoutSubviews] + 693 
8 UIKit        0x0069f322 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 178 
9 CoreFoundation      0x013d5e72 -[NSObject performSelector:withObject:] + 66 
10 QuartzCore       0x0042092d -[CALayer layoutSublayers] + 266 
11 QuartzCore       0x0042a827 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 231 
12 QuartzCore       0x003b0fa7 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 377 
13 QuartzCore       0x003b2ea6 _ZN2CA11Transaction6commitEv + 374 
14 QuartzCore       0x003b2580 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 80 
15 CoreFoundation      0x013a89ce __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30 
16 CoreFoundation      0x0133f670 __CFRunLoopDoObservers + 384 
17 CoreFoundation      0x0130b4f6 __CFRunLoopRun + 1174 
18 CoreFoundation      0x0130adb4 CFRunLoopRunSpecific + 212 
19 CoreFoundation      0x0130accb CFRunLoopRunInMode + 123 
20 GraphicsServices     0x03258879 GSEventRunModal + 207 
21 GraphicsServices     0x0325893e GSEventRun + 114 
22 UIKit        0x00660a9b UIApplicationMain + 1175 
23 MyApp        0x000023f9 main + 169 
24 MyApp        0x00002345 start + 53 

例外は次のとおりです。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x146acd8' 

info symbol 0x146acd8 
__kCFNull in section LC_SEGMENT.__DATA.__data of /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation 

2つ目のシナリオは類似しています。ただし、例外はまったく同じです。

0 CoreFoundation      0x013d406e __exceptionPreprocess + 206 
1 libobjc.A.dylib      0x019f0d0a objc_exception_throw + 44 
2 CoreFoundation      0x013d5ced -[NSObject doesNotRecognizeSelector:] + 253 
3 CoreFoundation      0x0133af00 ___forwarding___ + 432 
4 CoreFoundation      0x0133ace2 _CF_forwarding_prep_0 + 50 
5 UIKit        0x0086e851 -[UIButton layoutSubviews] + 1294 
6 UIKit        0x0069f322 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 178 
7 CoreFoundation      0x013d5e72 -[NSObject performSelector:withObject:] + 66 
8 QuartzCore       0x0042092d -[CALayer layoutSublayers] + 266 
9 QuartzCore       0x0042a827 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 231 
10 QuartzCore       0x003b0fa7 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 377 
11 QuartzCore       0x003b2ea6 _ZN2CA11Transaction6commitEv + 374 
12 QuartzCore       0x003b2580 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 80 
13 CoreFoundation      0x013a89ce __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30 
14 CoreFoundation      0x0133f670 __CFRunLoopDoObservers + 384 
15 CoreFoundation      0x0130b4f6 __CFRunLoopRun + 1174 
16 CoreFoundation      0x0130adb4 CFRunLoopRunSpecific + 212 
17 CoreFoundation      0x0130accb CFRunLoopRunInMode + 123 
18 GraphicsServices     0x03258879 GSEventRunModal + 207 
19 GraphicsServices     0x0325893e GSEventRun + 114 
20 UIKit        0x00660a9b UIApplicationMain + 1175 
21 MyApp        0x000023f9 main + 169 
22 MyApp        0x00002345 start + 53 
+1

クラッシュの詳細を確認できますか? –

+0

その他の情報は?あなたが何か具体的なものが必要な場合は、ただ聞いてください –

+0

実際に発生した例外は何ですか? –

答えて

1

例外として、ボタンのタイトルにNSStringを渡していると思われ、実際にNSNullのインスタンスを渡しているようです。これは、JSONソースなどからテーブルビューデータを派生させる場合には非常に一般的です。ソースフィールドが存在しない場合はNSNullが使用されます。

例外は、長さがNSNullの認識されたセレクタではなく、ボタンがサブビューをレイアウトしているときに出現するように見えることです。これは新しいタイトルを割り当てるときに実行されます。だから私はあなたの調査をその地域に集中させます。ボタンのタイトルを実際に送信しているかどうかを確認します。

0
MyCell* cell = (MyCell*)[tableView dequeueReusableCellWithIdentifier:cellID]; 
if (nil == cell) 
{ 
    NSArray* nibContents = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil]; 
cell = [nibContents objectAtIndex:0]; 
cell.selectionStyle = UITableViewCellSelectionStyleNone; 
[cell.buttonGPS addTarget:self action:@selector(actionGPS:)  forControlEvents:UIControlEventTouchUpInside]; 
[cell.buttonCall addTarget:self action:@selector(actionCall:) forControlEvents:UIControlEventTouchUpInside]; 
} 

// gps button 
[cell.buttonGPS setTitle:[NSString stringWithFormat:@"%d", indexPath.row] forState:UIControlStateNormal]; 

if (...condition...) 
{ 
cell.buttonCall.enabled = NO; 
} 
else 
{ 
cell.buttonCall.enabled = YES; 
[cell.buttonCall setTitle:[...TheTitleString...] forState:UIControlStateNormal]; 
} 

ウルコード&チェックでこれらの変更を行います。ここでは、コールスタックです。私はいくつかの状態が間違っているかもしれないと思うので、それを削除したターゲットを追加し、それが試みられたときにクラッシュしていました。