ios - 테이블뷰 - uitableview example swift 4




'인스턴스로 보낸 인식 할 수없는 선택기'오류를 디버깅하려면 어떻게해야합니까? (6)

내 테이블보기에 대한 사용자 지정 테이블 셀보기를 만드는 중입니다. 스토리 보드의 사용자 정의 셀 이미지 뷰를 신속하게 내 코드에 연결 한 후 다음 오류가 발생합니다.

[UITableViewCellContentView image]: unrecognized selector sent to instance 0x7fb4fad7fd20'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010ccbb3f5 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010e7e9bb7 objc_exception_throw + 45
    2   CoreFoundation                      0x000000010ccc250d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010cc1a7fc ___forwarding___ + 988
    4   CoreFoundation                      0x000000010cc1a398 _CF_forwarding_prep_0 + 120
    5   UIKit                               0x000000010d7d8881 -[UITableViewCell _marginWidth] + 151
    6   UIKit                               0x000000010d7ca23d -[UITableViewCell _separatorFrame] + 70
    7   UIKit                               0x000000010d7ca6fa -[UITableViewCell _updateSeparatorContent] + 360
    8   UIKit                               0x000000010d7d4e85 -[UITableViewCell _setSectionLocation:animated:forceBackgroundSetup:] + 1174
    9   UIKit                               0x000000010d634ea8 __53-[UITableView _configureCellForDisplay:forIndexPath:]_block_invoke + 1822
    10  UIKit                               0x000000010d5b5eae +[UIView(Animation) performWithoutAnimation:] + 65
    11  UIKit                               0x000000010d63477b -[UITableView _configureCellForDisplay:forIndexPath:] + 312
    12  UIKit                               0x000000010d63bcec -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 533
    13  UIKit                               0x000000010d61b7f1 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2846
    14  UIKit                               0x000000010d63165c -[UITableView layoutSubviews] + 213
    15  UIKit                               0x000000010d5be199 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 521
    16  QuartzCore                          0x00000001114b6f98 -[CALayer layoutSublayers] + 150
    17  QuartzCore                          0x00000001114abbbe _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
    18  QuartzCore                          0x00000001114aba2e _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
    19  QuartzCore                          0x0000000111419ade _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 242
    20  QuartzCore                          0x000000011141abea _ZN2CA11Transaction6commitEv + 390
    21  QuartzCore                          0x000000011141b255 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 89
    22  CoreFoundation                      0x000000010cbf0347 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    23  CoreFoundation                      0x000000010cbf02a0 __CFRunLoopDoObservers + 368
    24  CoreFoundation                      0x000000010cbe60d3 __CFRunLoopRun + 1123
    25  CoreFoundation                      0x000000010cbe5a06 CFRunLoopRunSpecific + 470
    26  GraphicsServices                    0x0000000110daa9f0 GSEventRunModal + 161
    27  UIKit                               0x000000010d545550 UIApplicationMain + 1282
    28  TestWork                          0x000000010caa432e top_level_code + 78
    29  TestWork                          0x000000010caa436a main + 42
    30  libdyld.dylib                       0x000000010efc3145 start + 1
    31  ???                                 0x0000000000000001 0x0 + 1
)

이 오류를 해결하는 방법을 알려주시겠습니까?

고맙습니다.

내 프로젝트에 예외 중단 점을 추가합니다.

이것은 부서지는 선입니다.

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCellWithIdentifier(kCellIdentifier) as ItemTableViewCell  <---------------

그러나 나는 코드에서 '이미지'를 사용하지 않는다.


나는 똑같은 문제가 있었는데 이것이 나를 위해 일했다.

SKScene에서 isEqual을 재정의하십시오.

- (BOOL)isEqual:(id)other {

    if (![other isMemberOfClass:[SKScene class]]) {
        return false;
    }
    return [super isEqual:other];
}

다른 가능한 이유는 원래 개체가 파괴 된 다음 다른 개체가 같은 메모리 주소에 할당되었다는 것입니다. 그런 다음 코드는 메시지를 보내고 이전 개체에 대한 포인터를 가지고 있다고 생각하고 Objective-C는 새 개체가 해당 메시지를 이해하지 못하기 때문에 예외를 throw합니다.

이 문제를 진단하려면 '좀비'탐지기로 프로필러를 실행하십시오.


당신은 tableview 셀의 객체를 선언하기 위해 indexPath 를 전달해야한다.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)

    return cell
}

이 시나리오에서는 두 가지를 살펴 보는 것이 도움이된다는 것을 알았습니다.

  1. 호출 스택
  2. 각 스택 프레임의 지역 변수 (및 그 유형)

이 오류가 발생했을 때 일반적으로 Type B를 예상 할 때 Type A의 인스턴스에 메시지를 보냈습니다.

이 특정 시나리오에서는 상위 클래스의 요구 사항을 만족하지 못할 수 있습니다 (ItemTableViewCell의 인스턴스가 상속 가능성이 높은 경우).

ItemTableViewCell 클래스의 코드를 표시 할 수 있습니까?


-[NSObject(NSObject) doesNotRecognizeSelector:] 에 기호 중단 점을 설정해보십시오. 중단 점 탐색기의 왼쪽 하단에있는 [+] 를 클릭하여 중단 점을 추가하십시오. 그런 다음 '심볼릭 브레이크 포인트 추가'를 클릭하십시오. 이제 충돌을 재현하면 코드에서 문제가 발생한 위치를 더 잘 파악할 수 있습니다.


Exception Breakpoints 사용하여 그러한 충돌을 쉽게 추적 할 수 있습니다.

Breakpoint Navigator 열고

예외 중단 점을 추가하면 옵션이 열려 Exception 를 선택할 수 있습니다.

Objective-C 선택하십시오.

코드를 실행하고 응용 프로그램을 중단하면 중단 점이 코드가 충돌하는 지점으로 이동합니다.