Ошибка в iOS 14.5 и 14.6 с кодом, работающим нормально в 14.2… как НАЧАТЬ, чтобы решить эту проблему?

Резюме:

Приложение отлично работает с iOS 14.2; вылетает последовательно с бесполезным сообщением об ошибке, как симулятора, так и устройства, с iOS 14.5 и 14.6. Я обнаружил код, наличие / отсутствие которого вызывает или устраняет ошибку, но это важная часть пользовательского интерфейса. С чего начать решение такой ситуации?

Подробности:

Большое приложение, все на Swift, использующее SwiftUI почти для всего пользовательского интерфейса, множество элементов экрана, основные данные, некоторая многопоточность. В симуляторе с iOS 14.2 приложение работает нормально (как и на моем iPad, пока я не обновил iOS). Недавно я обновил свой iPad до iOS 14.6, и когда я запускаю приложение на устройстве, у меня возникает сбой, о котором я расскажу ниже. Тот же самый код в симуляторе 14.2, работает нормально, без сбоев. Когда я запускаю код на симуляторе iOS 14.5 (для 14.6 пока нет симулятора), в этом симуляторе происходит такой же сбой, как и на устройстве.

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

          var body: some View {
        GeometryReader { geometry in
            HStack(spacing: 0){                
                LeftMainColumn()
                CenterMainColumn()
                RightMainColumn()                
            }            
        }
    } 

Каждый столбец выглядит примерно так:

      struct LeftMainColumn: View {
    func someData() -> [String] {
        return ["a","b","c"]      // different data in each column
    }
    var body: some View {
        GeometryReader { geom in
            ZStack {
                Rectangle()
                    .fill(Color.red)
                List{
                    ForEach(someData(), id: \.self) { dat in
                        Text("data: \(dat)")
                            .listRowBackground(Color.red)
                    }
                }
            }       // closes ZStack
        }       // closes GeometryReader
    }       // closes var body
}       // closes struct

Два других столбца в основном такие же, но с разными данными.

По сравнению с реальным проектом этот код сильно упрощен, и я включаю его, чтобы сообщить о том, где происходит сбой. С этим простым кодом сбоя не происходит. (В реальном приложении на экране гораздо больше; возможно, этого достаточно, чтобы вызвать проблему.)

Когда я закомментировал любой из столбцов, оставшиеся два отображаются нормально на устройствах 14,5 sim и 14,6. Когда у меня есть все 3 столбца, сбой 14.5 sim и 14.6 устройства, со следующим отчетом (14.2 sim отлично работает со всеми 3 столбцами):

      2021-06-24 19:58:02.989478-0500 AppName[40446:97339181] *** Assertion failure in -[_TtC7SwiftUIP33_BFB370BA5F1BADDC9D83021565761A4925UpdateCoalescingTableView _endCellAnimationsWithContext:], UITableView.m:2193
2021-06-24 19:58:03.020894-0500 AppName[40446:97339181] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to insert section 0 but there are only 0 sections after the update'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010daa7fba __exceptionPreprocess + 242
    1   libobjc.A.dylib                     0x000000010d0aaff5 objc_exception_throw + 48
    2   CoreFoundation                      0x000000010daa7de3 +[NSException raise:format:] + 0
    3   Foundation                          0x000000010cb478e7 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 191
    4   UIKitCore                           0x000000012bf82920 -[UITableView _endCellAnimationsWithContext:] + 9394
    5   UIKitCore                           0x000000012bf9dff7 -[UITableView endUpdatesWithContext:] + 116
    6   UIKitCore                           0x000000012bf9e1c9 -[UITableView _performBatchUpdates:withContext:completion:] + 253
    7   UIKitCore                           0x000000012bf9e2af -[UITableView performBatchUpdates:completion:] + 97
    8   SwiftUI                             0x000000010f37a801 $s7SwiftUI25UpdateCoalescingTableView33_BFB370BA5F1BADDC9D83021565761A49LLC19performBatchUpdates_10completionyyycSg_ySbcSgtF + 378
    9   SwiftUI                             0x000000010f37a8da $s7SwiftUI25UpdateCoalescingTableView33_BFB370BA5F1BADDC9D83021565761A49LLC19performBatchUpdates_10completionyyycSg_ySbcSgtFTo + 175
    10  SwiftUI                             0x000000010f37d31d $s7SwiftUI19ListCoreCoordinator33_BFB370BA5F1BADDC9D83021565761A49LLC17updateUITableView_2to11transactionySo0mN0C_xAA11TransactionVtF14performUpdatesL_yyAA0cD10DataSourceRzAA16SelectionManagerR_0V5ValueQy_AORtzr0_lF + 1594
    11  SwiftUI                             0x000000010f723652 $sIg_Ieg_TR + 12
    12  SwiftUI                             0x000000010f723668 $sIeg_IyB_TR + 14
    13  UIKitCore                           0x000000012c2cfbb9 +[UIView(Animation) performWithoutAnimation:] + 84
    14  SwiftUI                             0x000000010f37dc6f $s7SwiftUI19ListCoreCoordinator33_BFB370BA5F1BADDC9D83021565761A49LLC17updateUITableView_2to11transactionySo0mN0C_xAA11TransactionVtFyycfU_ + 467
    15  SwiftUI                             0x000000010f266eb7 $sIeg_ytIegr_TR + 12
    16  SwiftUI                             0x000000010f3851cf $sIeg_ytIegr_TRTA + 17
    17  SwiftUI                             0x000000010f38899f $sIeg_ytIegr_TRTA.42 + 9
    18  SwiftUI                             0x000000010f250ec4 $s7SwiftUI6UpdateO3endyyFZ + 433
    19  SwiftUI                             0x000000010f0a83fd $sSo9NSRunLoopC7SwiftUIE14flushObserversyyFZ + 148
    20  SwiftUI                             0x000000010f0a8367 $sSo9NSRunLoopC7SwiftUIE11addObserveryyyycFZySo05CFRunbF3RefaSg_So0gB8ActivityVSvSgtcfU_yyXEfU_ + 9
    21  SwiftUI                             0x000000010f0a35fe $ss5Error_pIgzo_ytsAA_pIegrzo_TR95$sSo9NSRunLoopC7SwiftUIE11addObserveryyyycFZySo05CFRunbF3RefaSg_So0gB8ActivityVSvSgtcfU_yyXEfU_Tf3npf_n + 14
    22  libswiftObjectiveC.dylib            0x000000011445e03e $s10ObjectiveC15autoreleasepool8invokingxxyKXE_tKlF + 46
    23  SwiftUI                             0x000000010f0a8356 $sSo9NSRunLoopC7SwiftUIE11addObserveryyyycFZySo05CFRunbF3RefaSg_So0gB8ActivityVSvSgtcfU_ + 35
    24  SwiftUI                             0x000000010f0a8459 $sSo9NSRunLoopC7SwiftUIE11addObserveryyyycFZySo05CFRunbF3RefaSg_So0gB8ActivityVSvSgtcfU_To + 43
    25  CoreFoundation                      0x000000010da14d31 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    26  CoreFoundation                      0x000000010da0f542 __CFRunLoopDoObservers + 541
    27  CoreFoundation                      0x000000010da0faf5 __CFRunLoopRun + 1129
    28  CoreFoundation                      0x000000010da0f1a7 CFRunLoopRunSpecific + 567
    29  GraphicsServices                    0x00000001194d2d85 GSEventRunModal + 139
    30  UIKitCore                           0x000000012bd854df -[UIApplication _run] + 912
    31  UIKitCore                           0x000000012bd8a39c UIApplicationMain + 101
    32  PlayingWithSwiftUI_10_OverallFlow   0x000000010a18ac6b main + 75
    33  libdyld.dylib                       0x0000000115fa0bbd start + 1
    34  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to insert section 0 but there are only 0 sections after the update'
terminating with uncaught exception of type NSException
CoreSimulator 757.5 - Device: 14.5 iPadAir3rdGen (7EB4A57C-0A14-4C84-8740-943D694B877A) - Runtime: iOS 14.5 (18E182) - DeviceType: iPad Air (3rd generation)

Я также могу избавиться от вылета, заменив ForEach заявление с серией Text("x") операторов, но вся суть приложения в том, что оно отображает фактические данные, а не x x x.

Итак, я определил, где происходит сбой в симуляторе / устройстве 14,5 / 14,6, но я понятия не имею, как решить сбой. В приложении обязательно должны присутствовать все 3 столбца, поэтому «просто удалите один столбец», хотя это абсолютно позволяет избежать ошибки, не является решением.

Кроме «надеюсь, что они исправят это в iOS 15», где начать работу по исправлению приложения, которое работало (все еще работает) нормально в iOS 14.2, но умирает в более поздних версиях iOS?

1 ответ

Вы упомянули Core Data.

Я только что нашел исправление в своем проекте, который страдал от той же проблемы:

  • Недавно вылетает от 14.5
  • Бесполезная трассировка стека
  • Жалобы на вывод журнала attempt to insert section 0 but there are only 0 sections after the update

Для файла такой структуры:

      struct CrashingView: View {
    
    @FetchRequest var listContent: FetchedResults<Entity>

    var body: some View {
        List {
            ForEach(listContent, id:\.self) {
                 Cell($0)
        }
    }

}

исправление состоит в том, чтобы проверить, что у вашего извлекаемого содержимого счетчик больше 0:

      struct CrashingView: View {
    
    @FetchRequest var listContent: FetchedResults<Entity>

    var body: some View {

        if listContent.count > 0 {
            List {
                ForEach(listContent, id:\.self) {
                     Cell($0)
                 }
            }
        } else {
          EmptyView()
        }
    }

}

Немного глупо, да, но это достаточно легко исправить. Надеюсь, это поможет в вашем случае.

Другие вопросы по тегам