Ткань Crash iOS - PullRequest
       9

Ткань Crash iOS

0 голосов
/ 30 апреля 2019

Я получаю сбой матрицы при использовании метода TableView cellForRowAtIndexPath:.

Вот строка №.Код 166 в моем проекте и код имеют класс «Democell» и идентификатор ячейки, так что оба значения всегда присутствуют, тогда почему происходит сбой, я провел много исследований, но все еще не нашел причину.

У меня есть вызов tablview.reloadData() метод из 2 мест, одно из них - viewWillAppear метод, а также когда я получаю ответ от сервера.

Fabric Crash

Crashed: com.apple.main-thread
0  sRideIphone                    0x100c7d098 DemoTabViewController.tableView(_:cellForRowAt:) (DemoTabViewController.swift:166)
1  sRideIphone                    0x100c7d994 @objc DemoTabViewController.tableView(_:cellForRowAt:) (<compiler-generated>)
2  UIKitCore                      0x1b4f76a38 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 680
3  UIKitCore                      0x1b4f76f38 -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 80
4  UIKitCore                      0x1b4f43740 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2260
5  UIKitCore                      0x1b4f60a60 -[UITableView layoutSubviews] + 140
6  UIKitCore                      0x1b51e3e54 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1292
7  QuartzCore                     0x18cdea1f0 -[CALayer layoutSublayers] + 184
8  QuartzCore                     0x18cdef198 CA::Layer::layout_if_needed(CA::Transaction*) + 332
9  QuartzCore                     0x18cd520a8 CA::Context::commit_transaction(CA::Transaction*) + 348
10 QuartzCore                     0x18cd80108 CA::Transaction::commit() + 640
11 UIKitCore                      0x1b4d55710 _UIApplicationFlushRunLoopCATransactionIfTooLate + 156
12 UIKitCore                      0x1b4e3e1f4 __handleEventQueueInternal + 5604
13 UIKitCore                      0x1b4e3711c __handleHIDEventFetcherDrain + 152
14 CoreFoundation                 0x1888ee2bc __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
15 CoreFoundation                 0x1888ee23c __CFRunLoopDoSource0 + 88
16 CoreFoundation                 0x1888edb24 __CFRunLoopDoSources0 + 176
17 CoreFoundation                 0x1888e8a60 __CFRunLoopRun + 1004
18 CoreFoundation                 0x1888e8354 CFRunLoopRunSpecific + 436
19 GraphicsServices               0x18aae879c GSEventRunModal + 104
20 UIKitCore                      0x1b4d5bb68 UIApplicationMain + 212
21 sRideIphone                    0x100bcbf60 main (AppDelegate.swift:17)
22 libdyld.dylib                  0x1883ae8e0 start + 4 
let DEMO_CELL_ID = "demoCellID" 

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

let demoCell:DemoCell = tableView.dequeueReusableCell(withIdentifier: DEMO_CELL_ID) as! DemoCell // This is line 166
demoCell.selectionStyle = .none
let items = arrSections[indexPath.section].items[indexPath.row]
 if items["name"] as! String  == "country"{
      demoCell.lblCountry.isHidden = false
  }

 return demoCell
}

Я ожидаю найти и решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Общая ошибка заключается в том, что вы гарантируете, что объект ячейки будет возвращен из .dequeueReusableCell ().Скорее всего, будут выполнены все предварительные условия, но в вашем случае вы получите дополнительную ссылку.(Рассматривайте его как возможную ссылку NULL, если это новое.) Возможно, ваша ячейка не имеет правильного идентификатора, установленного в StoryBoard.

Каждая ячейка в StoryBoard должна знать свой идентификатор, потому что этот идентификатор используется дляпоищи это.Проверьте, введен ли он в свойствах.(См. Снимок экрана, чтобы увидеть, где) enter image description here

Другая ловушка предполагает, что вы всегда получаете ячейку, где интерфейс сообщает вам, что она необязательна.Но делегат требует, чтобы вы всегда возвращали объект, поэтому вы идете и предоставляете его, используя «!».Большую часть времени вы получаете камеру, но опечатки случаются.Хороший способ работы со Swift - избегать!и используйте?.

Например, вы можете обработать ячейку следующим образом:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let demoCell:DemoCell = tableView.dequeueReusableCell(withIdentifier: DEMO_CELL_ID) as? DemoCell // This is line 166
    demoCell?.selectionStyle = .none
    let items = arrSections[indexPath.section].items[indexPath.row]
    if items["name"] as! String  == "country"{
        demoCell?.lblCountry.isHidden = false
    }
    return demoCell ?? UITableViewCell()
}

Если demoCell равен NULL, тогда создайте пустую базовую ячейку и верните ее.Не результат пользовательского интерфейса вы хотите, но и без сбоев.Теперь вы можете посмотреть, почему клетка не отключилась, как ожидалось.Большую часть времени получить клетку не составит труда, если что-то не так.

0 голосов
/ 30 апреля 2019

Попробуйте это

Если вы используете XIB, зарегистрируйте ячейку, как эта

self.register(UINib(nibName: "DemoCell", bundle: nil), forCellReuseIdentifier: "DemoCell")

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

self.register(DemoCell.self, forCellReuseIdentifier: "DemoCell")

и установить идентификатор ячейки: - DemoCell

let DEMO_CELL_ID = "demoCellID" 

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

let demoCell:DemoCell = tableView.dequeueReusableCell(withIdentifier: DEMO_CELL_ID) as? DemoCell // This is line 166
demoCell?.selectionStyle = .none
let items = arrSections[indexPath.section].items[indexPath.row]
 if items["name"] as! String  == "country"{
      demoCell?.lblCountry.isHidden = false
  }

 return demoCell!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...