Làm cách nào để gỡ lỗi 'bộ chọn không nhận dạng được gửi đến phiên bản'


100

Tôi đang tạo chế độ xem ô bảng tùy chỉnh cho chế độ xem bảng của mình. Sau khi tôi kết nối chế độ xem hình ảnh của ô tùy chỉnh (trong bảng phân cảnh) với mã của mình nhanh chóng, tôi gặp lỗi sau.

[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
)

Bạn có thể vui lòng cho tôi biết làm thế nào để giải quyết lỗi này?

Cảm ơn bạn.

Tôi thêm một điểm ngắt ngoại lệ trong dự án của mình.

Đây là dòng mà nó bị đứt.

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

Nhưng tôi không sử dụng 'hình ảnh' trong mã của mình.


2
bạn đang gọi image]ở đâu đó .. nhưng nhầm đối tượng. dòng đầu tiên của các lỗi nói với bạn rằng nhiều
ccwasden

1
Dừng gọi [image] trên UITableViewCellContentView - điều đó sẽ khắc phục được sự cố. Cho chúng tôi xem mã gây ra sự cố này.
Grzegorz Krukowski

1
Tôi nghĩ rằng bạn đã sử dụng một số hình ảnh trong tableViewCell nhưng hình ảnh đó có thể không có trong gói của bạn.
Nand Parikh

Câu trả lời:


102

Hãy thử đặt một điểm ngắt biểu tượng trên -[NSObject(NSObject) doesNotRecognizeSelector:]. Chỉ cần nhấp vào [+]ở góc dưới cùng bên trái của Bộ điều hướng điểm ngắt để thêm điểm ngắt. Sau đó nhấp vào 'Thêm điểm ngắt biểu tượng'. Việc tạo lại sự cố của bạn ngay bây giờ sẽ cung cấp cho bạn ý tưởng tốt hơn về vị trí xảy ra sự cố trong mã của bạn.

nhập mô tả hình ảnh ở đây


17
Cũng có thể chỉ thêm một điểm ngắt ngoại lệ .
Rebello95,

1
Đã cứu một ngày của tôi, anh bạn.
AntiMoron

1
Cảm ơn bạn nó là như vậy hữu ích
Mohd Sadham

35

Bạn có thể dễ dàng theo dõi các sự cố như vậy bằng cách sử dụng Exception Breakpoints .

Mở Breakpoint Navigatorvà thêm

nhập mô tả hình ảnh ở đây

Khi bạn thêm Điểm ngắt ngoại lệ, tùy chọn sẽ mở để chọn Exception.

nhập mô tả hình ảnh ở đây

Lựa chọn Objective-C .

Chạy mã và làm sập ứng dụng, điểm ngắt sẽ dừng bạn đến điểm mã bị treo.


Nó xảy ra trên AppDelegate dòng 1. Bây giờ thì sao? :(
Daniel Springer

Bạn có thể hiển thị một số mã của bạn được viết trong AppDelegate không? Nơi nó đang tạm dừng điểm ngắt. Và cả các bản ghi nữa.
Vatsal K

nó tạm dừng ở dòng 1, nơi ủy quyền ứng dụng được tuyên bố
Daniel Springer

Có một số trường hợp nó tạm dừng do một số khuôn khổ, nhưng đừng lo lắng về điều đó, bạn có thể cần phải nhấn nút tiếp tục trong 3-4 lần để chạy ứng dụng.
Vatsal K

Đó không phải là một lỗi trong trường hợp này, Một số khuôn khổ cũ đang gây ra loại sự cố này. Hãy thử bằng cách cập nhật các khuôn khổ cũ của bạn thành các khuôn khổ mới / cập nhật. Điều đó sẽ giải quyết vấn đề.
Vatsal K

30

Bước đầu tiên quan trọng là phân tích thông báo lỗi:

[UITableViewCellContentView image]: unrecognized selector sent to instance

Điều này cho bạn biết rằng "thông báo" imageđã được "gửi" đến một đối tượng của lớp UITableViewCellContentView. (Nói cách khác, một nỗ lực đã được thực hiện để gọi phương thứcimage trên một đối tượng của lớp UITableViewCellContentView.)

Điều đầu tiên cần hỏi là "Điều này có ý nghĩa gì không?" Có thể lớp được đặt tên có một Imagephương thức, nhưng không phải là một imagephương thức, và do đó, tên phương thức sai đã được sử dụng trong cuộc gọi. Hoặc có thể là phương thức được đặt tên someMethod:someParm:, nhưng lớp thực hiệnsomeMethod:someParm:anotherParm: , nghĩa là một tham số đã bị bỏ qua trong lời gọi.

Tuy nhiên, thông thường nhất, lớp được đặt tên không có bất kỳ phương thức nào thậm chí giống với phương thức được đặt tên một cách mơ hồ, có nghĩa là bằng cách nào đó một con trỏ đến đối tượng sai đã được sử dụng trong lệnh gọi thất bại.

Ví dụ, người ta có thể làm:

NSArray* myArray = [myDictionary objectForKey:@"values"];
NSString* myString = [myArray objectAtIndex:5];

Và gặp lỗi dọc theo các dòng:

[__NSDictionaryI objectAtIndex:] unrecognized selector sent to instance

bởi vì đối tượng được truy xuất từ myDictionary trên thực tế là NSDictionary, không phải NSArray được mong đợi.

Thật không may, khó hiểu nhất là khi loại lỗi này xảy ra sâu trong mã hệ thống giao diện người dùng chứ không phải trong mã của riêng bạn. Điều này có thể xảy ra khi bạn bằng cách nào đó đã truyền nhầm đối tượng vào giao diện hệ thống hoặc có thể đã định cấu hình sai lớp trong Trình tạo giao diện hoặc bất cứ nơi nào.


6

Một lý do có thể khác là đối tượng ban đầu đã bị phá hủy và sau đó đối tượng khác được cấp phát tại cùng địa chỉ bộ nhớ. Sau đó, mã của bạn gửi thông báo, nghĩ rằng nó vẫn còn một con trỏ đến đối tượng cũ và Objective-C ném ra một ngoại lệ vì đối tượng mới không hiểu thông báo đó.

Để chẩn đoán sự cố này, hãy chạy Hồ sơ với tính năng phát hiện 'Zombies'.


2

Swift 5.0

Bạn có thể sử dụng Introspection để tìm hiểu xem đối tượng có phản hồi với một bộ chọn cụ thể hay không ..

let canWork = yourObject.respondsToSelector(Selector("image"))   // true

Chỉ khi đúng thì mã đó mới hoạt động .. nếu không thì chắc chắn nó sẽ sập


1

Trong những tình huống này, tôi thấy hữu ích khi xem xét hai điều

  1. Ngăn xếp cuộc gọi
  2. Các biến cục bộ (và kiểu của chúng) tại mỗi khung ngăn xếp

Khi tôi gặp lỗi này, thường là do tôi đã gửi tin nhắn đến một phiên bản của Loại A, khi tôi đang mong đợi Loại B.

Trong trường hợp cụ thể này, bạn có thể không đáp ứng yêu cầu của lớp cha (với trường hợp của bạn có nhiều khả năng là ItemTableViewCell kế thừa).

Bạn có thể cho chúng tôi xem mã cho lớp ItemTableViewCell của bạn không?


1

Bạn có thể sử dụng đoạn mã sau để khai báo biến:

let noteListTableViewCellobject = "NoteListTableViewCell";` `// Note listTablecell create custom cell`

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

    var cell:NoteListTableViewCell? = tableView.dequeueReusableCellWithIdentifier(noteListTableViewCellobject) as? NoteListTableViewCell

    if (cell == nil) {
        let nib:Array = NSBundle.mainBundle().loadNibNamed("NoteListTableViewCell", owner: self, options: nil)
        cell = nib[0] as? NoteListTableViewCell
    }
}

0

Tôi đã gặp vấn đề tương tự và điều này đã hiệu quả với tôi:

Ghi đè isEqual trong SKScene của bạn:

- (BOOL)isEqual:(id)other {

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

0

Bạn phải vượt qua indexPathđể khai báo đối tượng của ô tableview.

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

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

    return cell
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.