2012-01-15 1 views
0

UITableViewCell에는 2 UIButton 인스턴스가 있습니다. 두 버튼 모두 기본 이미지가 있습니다. "불량"버튼에만 비활성화 상태에 대한 이미지가 있습니다. 아무것도 더. 신비한 UIButton 충돌

셀 클래스에서이 두 버튼은 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 

두 번째 시나리오는 비슷합니다. 그러나 예외는 완전히 동일합니다.

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]; 
} 

통해 UR 코드 & 검사에서 이러한 변경 사항을 확인 : 다음 호출 스택입니다. 나는 어떤 조건이 잘못되었을 수 있다고 생각한다. 그래서 b4는 목표를 추가하고 그것을 제거했고 시도했을 때 충돌했다.