Cra sh в tableView (_: cellForRowAt :) iOS 13 - PullRequest
0 голосов
/ 23 марта 2020

Я получаю этот крей sh все больше и больше с момента выпуска iOS 13, чтобы добраться до точки, где я регистрирую ячейки

self.messagesTable.register(UINib(nibName: "MessagesCell", bundle: nil), forCellReuseIdentifier: "MessagesCell")
self.messagesTable.register(UINib(nibName: "NativeAdCell", bundle: nil), forCellReuseIdentifier: "cell")

И способ их использования в cellForrow:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if pageArray.count == 0 {return UITableViewCell()}
        if pageArray.isValidIndex(indexPath.row) == false {return UITableViewCell()}

        if pageArray[indexPath.row] is UIView{

            if let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? NativeAdCell {

                return cell

            }else {

                return UITableViewCell()

            }

        }else {

            if let cell =  tableView.dequeueReusableCell(withIdentifier: "MessagesCell", for: indexPath) as? MessagesCell {

                return cell

            }else {

                return UITableViewCell()
            }

        }

}

Вот журнал:

Crashed: com.apple.main-thread
0  APPNAME                        0x1002a4f68 MessagesDetail.tableView(_:cellForRowAt:) + 4341010280 (<compiler-generated>:4341010280)
1  APPNAME                        0x1002a4ffc @objc MessagesDetail.tableView(_:cellForRowAt:) + 4341010428 (<compiler-generated>:4341010428)
2  UIKitCore                      0x1c6285880 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 640
3  UIKitCore                      0x1c6252f40 -[UITableView _updateVisibleCellsNow:] + 2608
4  UIKitCore                      0x1c6270108 -[UITableView layoutSubviews] + 160
5  UIKitCore                      0x1c653617c -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2140
6  QuartzCore                     0x1c8a9e2c0 -[CALayer layoutSublayers] + 284
7  QuartzCore                     0x1c8aa443c CA::Layer::layout_if_needed(CA::Transaction*) + 480
8  QuartzCore                     0x1c8aaf140 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 136
9  QuartzCore                     0x1c89f7884 CA::Context::commit_transaction(CA::Transaction*, double) + 304
10 QuartzCore                     0x1c8a21574 CA::Transaction::commit() + 676
11 QuartzCore                     0x1c8a21f68 CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 92
12 CoreFoundation                 0x1c1f97e68 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
13 CoreFoundation                 0x1c1f92d54 __CFRunLoopDoObservers + 416
14 CoreFoundation                 0x1c1f93320 __CFRunLoopRun + 1308
15 CoreFoundation                 0x1c1f92adc CFRunLoopRunSpecific + 464
16 GraphicsServices               0x1cbf33328 GSEventRunModal + 104
17 UIKitCore                      0x1c60a063c UIApplicationMain + 1936
18 APPNAME                        0x10025c68c main + 21 (SearchViewController.swift:21)
19 libdyld.dylib                  0x1c1e1c360 start + 4

Теперь я полностью потерян, я не получаю этот cra sh, когда все пользователи просто указывают c , Почему ? и кто-нибудь может объяснить, что именно я делаю неправильно?

я пробовал другой вид регистрации ошибок или проверки основного потока или все исключения, но ничего не вышло.

1 Ответ

0 голосов
/ 23 марта 2020

Здесь есть несколько ужасных вещей, на которые можно указать

1- Если массив пуст, то cellForRowAt не будет вызываться, поэтому это бесполезно

if pageArray.count == 0 {return UITableViewCell()}

2- Вы нужно отфильтровать ваши данные перед перезагрузкой таблицы, так что это бесполезно

if pageArray.isValidIndex(indexPath.row) == false {return UITableViewCell()}

3- Не используйте if let здесь

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? NativeAdCell {

, как будто таблица регистрирует ячейку он будет на 100% возвращать ячейку, вместо этого используйте

 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! NativeAdCell  

4 - вам не нужно помещать представления в массив, вам нужен логический лог c вместо

if pageArray[indexPath.row] is UIView{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...