Xcode 13 beta 5 error: UIViewController is missing its initial trait collection populated during initialization
Xcode 13 beta 5 error: UIViewController is missing its initial trait collection populated during initialization
在 Xcode 13 个 beta 5 版本之前,应用程序运行良好。
在我们的视图控制器中的这行初始化代码中突然出现这个错误:
init(dataProvider: DataProvider) {
self.dataProvider = dataProvider
super.init(style: .plain)
dataProvider.delegate = self
}
此代码在 Xcode 12 中运行良好,没有任何更改,现在中断:
'NSInternalInconsistencyException', reason: 'UIViewController is
missing its initial trait collection populated during initialization.
This is a serious bug, likely caused by accessing properties or
methods on the view controller before calling a UIViewController
initializer. View controller: <UITableViewController: 0x7f7fbd291bb0>'
我用谷歌搜索了一下,只 found 1 obscure thread 解决了这个问题,但没有太大帮助。
有时放置一个断点并进入允许它在不崩溃的情况下工作,所以在引擎盖下似乎存在某种布局竞争条件,但我正在努力调试。我试过睡一会儿,但没用。
感谢任何关于如何调试它的建议。现在我无法获得额外的信息来进行调试。如果您知道可能导致此问题的原因或查找位置,我将不胜感激您的意见。
这是错误堆栈跟踪:
*** First throw call stack:
(
0 CoreFoundation 0x00007fff203fc8a8 __exceptionPreprocess + 242
1 libobjc.A.dylib 0x00007fff2019ebe7 objc_exception_throw + 48
2 Foundation 0x00007fff207501c9 -[NSMutableDictionary(NSMutableDictionary) classForCoder] + 0
3 UIKitCore 0x00007fff248310ed UIViewControllerMissingInitialTraitCollection + 188
4 UIKitCore 0x00007fff24835616 -[UIViewController traitCollection] + 155
5 UIKitCore 0x00007fff24824392 -[UITableViewController dealloc] + 196
6 App Dev 0x000000010e4f5680 $s05AppLaB027MyViewController
C14paymentMethods13selectedIndex5offer8delegateACSaySo16AppPaymentMethodCG_SiAA5Offer_pAA08CheckoutcD8Delegate_pSgtcfc + 368
7 App Dev 0x000000010e4f5726 $s05AppLaB027MyViewController
C14paymentMethods13selectedIndex5offer8delegateACSaySo16AppPaymentMethodCG_SiAA5Offer_pAA08CheckoutcD8Delegate_pSgtcfcTo + 102
8 App Dev 0x000000010e289291 -[CartViewController showPaymentMethodPickerWithPaymentMethods:] + 385
9 App Dev 0x000000010e289055 __59-[CartViewController showPaymentMethodPickerOrEntryForm]_block_invoke + 245
10 App Dev 0x000000010e7075ae $sSo16AppServiceResultVSo7NSArrayCSgSo7NSErrorCSgIeyByyy_ABSaySo16AppPaymentMethodCGSgs5Error_pSgIegygg_TR + 222
11 App Dev 0x000000010e707246 $sSo17AppAccountServiceC05AppLaD0E19fetchPaymentMethods11forListType7refresh09preferredF6Method10completionSo17AppRequestReceipt_pSgAC0fmiJ0O_S2bySo16AppServiceResultV_SaySo010AppPaymentM0CGSgs5Error_pSgtcSgtFyAN_ArTtcfU_ + 630
12 App Dev 0x000000010e707333 $sSo17AppAccountServiceC05AppLaD0E19fetchPaymentMethods11forListType7refresh09preferredF6Method10completionSo17AppRequestReceipt_pSgAC0fmiJ0O_S2bySo16AppServiceResultV_SaySo010AppPaymentM0CGSgs5Error_pSgtcSgtFyAN_ArTtcfU_TA + 35
13 App Dev 0x000000010e580474 $sSo16AppServiceResultVSaySo16AppPaymentMethodCGSgs5Error_pSgIegygg_ABSo7NSArrayCSgSo7NSErrorCSgIeyByyy_TR + 212
14 App Dev 0x000000010e39bcad __79-[AppAccountV3DAO fetchPaymentMethodsRefresh:preferredPaymentMethod:withBlock:]_block_invoke + 45
15 libdispatch.dylib 0x0000000110c18a18 _dispatch_call_block_and_release + 12
16 libdispatch.dylib 0x0000000110c19bfc _dispatch_client_callout + 8
17 libdispatch.dylib 0x0000000110c28366 _dispatch_main_queue_callback_4CF + 1195
18 CoreFoundation 0x00007fff2036a555 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
19 CoreFoundation 0x00007fff20364db2 __CFRunLoopRun + 2772
20 CoreFoundation 0x00007fff20363dfb CFRunLoopRunSpecific + 567
21 GraphicsServices 0x00007fff2cbb5cd3 GSEventRunModal + 139
22 UIKitCore 0x00007fff24fee193 -[UIApplication _run] + 928
23 UIKitCore 0x00007fff24ff2bfb UIApplicationMain + 101
24 App Dev 0x000000010e267120 main + 96
25 dyld 0x0000000110654e1e start_sim + 10
26 ??? 0x0000000000000001 0x0 + 1
27 ??? 0x0000000000000001 0x0 + 1
)
注释掉很多代码后,我开始收到新的错误:
致命错误:为 class“PaymentPickerViewController”
使用了未实现的初始化程序“init(style:)”
进一步查看行为,似乎我们有一个 objc 初始化扩展。我相信这个 Xcode 13,objc 代码被破坏并且没有“看到”对初始化程序的根调用。
我们原来的初始化代码路径是这样的:
@objc extension PaymentPickerViewController {
convenience init() {
dataProvider = DataProvider()
self.init(dataProvider: dataProvider)
}
}
init(dataProvider: DataProvider) {
self.dataProvider = dataProvider
super.init(style: .plain)
}
修复明确覆盖了我们想从 super:
使用的 swift init
override init(style: UITableView.Style) {
super.init(style: .plain)
self.dataProvider = DataProvider()
}
这会强制 objc 看到正确的初始化,然后它就会工作。
我担心我发布的原始错误非常具有误导性,因此希望这对遇到此问题的任何人有所帮助。
简短说明: 对于基于 objective-C 的实现,可以将对象方法转换为 class 方法。
在 xcode13
GM Seed 上报告了以下错误。错误日志:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIViewController is missing
its initial trait collection populated during initialization. This is
a serious bug, likely caused by accessing properties or methods on the
view controller before calling a UIViewController initializer. View
controller: <MyViewController: 0x7fa5ae2356c0>'
以下init method
:
- (instancetype)initWithModel:(MyModel *)myModel {
MyViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"MyViewController"];
vc.model = myModel;
return vc;
}
init
以下列方式从另一个 View Controller
.
调用
// Before - invoking object method -- Results in the error
MyViewController *viewController = [[MyViewController alloc] initWithModel:testModel];
// After - invoking Class method
MyViewController *viewController = [MyViewController initWithModel:testModel];
为了解决,我把init
方法改成了class方法
+ (instancetype)initWithModel:(MyModel *)myModel {
MyViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"MyViewController"];
vc.model = myModel;
return vc;
}
在 Xcode 13 个 beta 5 版本之前,应用程序运行良好。
在我们的视图控制器中的这行初始化代码中突然出现这个错误:
init(dataProvider: DataProvider) {
self.dataProvider = dataProvider
super.init(style: .plain)
dataProvider.delegate = self
}
此代码在 Xcode 12 中运行良好,没有任何更改,现在中断:
'NSInternalInconsistencyException', reason: 'UIViewController is missing its initial trait collection populated during initialization. This is a serious bug, likely caused by accessing properties or methods on the view controller before calling a UIViewController initializer. View controller: <UITableViewController: 0x7f7fbd291bb0>'
我用谷歌搜索了一下,只 found 1 obscure thread 解决了这个问题,但没有太大帮助。
有时放置一个断点并进入允许它在不崩溃的情况下工作,所以在引擎盖下似乎存在某种布局竞争条件,但我正在努力调试。我试过睡一会儿,但没用。
感谢任何关于如何调试它的建议。现在我无法获得额外的信息来进行调试。如果您知道可能导致此问题的原因或查找位置,我将不胜感激您的意见。
这是错误堆栈跟踪:
*** First throw call stack:
(
0 CoreFoundation 0x00007fff203fc8a8 __exceptionPreprocess + 242
1 libobjc.A.dylib 0x00007fff2019ebe7 objc_exception_throw + 48
2 Foundation 0x00007fff207501c9 -[NSMutableDictionary(NSMutableDictionary) classForCoder] + 0
3 UIKitCore 0x00007fff248310ed UIViewControllerMissingInitialTraitCollection + 188
4 UIKitCore 0x00007fff24835616 -[UIViewController traitCollection] + 155
5 UIKitCore 0x00007fff24824392 -[UITableViewController dealloc] + 196
6 App Dev 0x000000010e4f5680 $s05AppLaB027MyViewController
C14paymentMethods13selectedIndex5offer8delegateACSaySo16AppPaymentMethodCG_SiAA5Offer_pAA08CheckoutcD8Delegate_pSgtcfc + 368
7 App Dev 0x000000010e4f5726 $s05AppLaB027MyViewController
C14paymentMethods13selectedIndex5offer8delegateACSaySo16AppPaymentMethodCG_SiAA5Offer_pAA08CheckoutcD8Delegate_pSgtcfcTo + 102
8 App Dev 0x000000010e289291 -[CartViewController showPaymentMethodPickerWithPaymentMethods:] + 385
9 App Dev 0x000000010e289055 __59-[CartViewController showPaymentMethodPickerOrEntryForm]_block_invoke + 245
10 App Dev 0x000000010e7075ae $sSo16AppServiceResultVSo7NSArrayCSgSo7NSErrorCSgIeyByyy_ABSaySo16AppPaymentMethodCGSgs5Error_pSgIegygg_TR + 222
11 App Dev 0x000000010e707246 $sSo17AppAccountServiceC05AppLaD0E19fetchPaymentMethods11forListType7refresh09preferredF6Method10completionSo17AppRequestReceipt_pSgAC0fmiJ0O_S2bySo16AppServiceResultV_SaySo010AppPaymentM0CGSgs5Error_pSgtcSgtFyAN_ArTtcfU_ + 630
12 App Dev 0x000000010e707333 $sSo17AppAccountServiceC05AppLaD0E19fetchPaymentMethods11forListType7refresh09preferredF6Method10completionSo17AppRequestReceipt_pSgAC0fmiJ0O_S2bySo16AppServiceResultV_SaySo010AppPaymentM0CGSgs5Error_pSgtcSgtFyAN_ArTtcfU_TA + 35
13 App Dev 0x000000010e580474 $sSo16AppServiceResultVSaySo16AppPaymentMethodCGSgs5Error_pSgIegygg_ABSo7NSArrayCSgSo7NSErrorCSgIeyByyy_TR + 212
14 App Dev 0x000000010e39bcad __79-[AppAccountV3DAO fetchPaymentMethodsRefresh:preferredPaymentMethod:withBlock:]_block_invoke + 45
15 libdispatch.dylib 0x0000000110c18a18 _dispatch_call_block_and_release + 12
16 libdispatch.dylib 0x0000000110c19bfc _dispatch_client_callout + 8
17 libdispatch.dylib 0x0000000110c28366 _dispatch_main_queue_callback_4CF + 1195
18 CoreFoundation 0x00007fff2036a555 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
19 CoreFoundation 0x00007fff20364db2 __CFRunLoopRun + 2772
20 CoreFoundation 0x00007fff20363dfb CFRunLoopRunSpecific + 567
21 GraphicsServices 0x00007fff2cbb5cd3 GSEventRunModal + 139
22 UIKitCore 0x00007fff24fee193 -[UIApplication _run] + 928
23 UIKitCore 0x00007fff24ff2bfb UIApplicationMain + 101
24 App Dev 0x000000010e267120 main + 96
25 dyld 0x0000000110654e1e start_sim + 10
26 ??? 0x0000000000000001 0x0 + 1
27 ??? 0x0000000000000001 0x0 + 1
)
注释掉很多代码后,我开始收到新的错误:
致命错误:为 class“PaymentPickerViewController”
使用了未实现的初始化程序“init(style:)”进一步查看行为,似乎我们有一个 objc 初始化扩展。我相信这个 Xcode 13,objc 代码被破坏并且没有“看到”对初始化程序的根调用。
我们原来的初始化代码路径是这样的:
@objc extension PaymentPickerViewController {
convenience init() {
dataProvider = DataProvider()
self.init(dataProvider: dataProvider)
}
}
init(dataProvider: DataProvider) {
self.dataProvider = dataProvider
super.init(style: .plain)
}
修复明确覆盖了我们想从 super:
使用的 swift initoverride init(style: UITableView.Style) {
super.init(style: .plain)
self.dataProvider = DataProvider()
}
这会强制 objc 看到正确的初始化,然后它就会工作。
我担心我发布的原始错误非常具有误导性,因此希望这对遇到此问题的任何人有所帮助。
简短说明: 对于基于 objective-C 的实现,可以将对象方法转换为 class 方法。
在 xcode13
GM Seed 上报告了以下错误。错误日志:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIViewController is missing
its initial trait collection populated during initialization. This is
a serious bug, likely caused by accessing properties or methods on the
view controller before calling a UIViewController initializer. View
controller: <MyViewController: 0x7fa5ae2356c0>'
以下init method
:
- (instancetype)initWithModel:(MyModel *)myModel {
MyViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"MyViewController"];
vc.model = myModel;
return vc;
}
init
以下列方式从另一个 View Controller
.
调用
// Before - invoking object method -- Results in the error
MyViewController *viewController = [[MyViewController alloc] initWithModel:testModel];
// After - invoking Class method
MyViewController *viewController = [MyViewController initWithModel:testModel];
为了解决,我把init
方法改成了class方法
+ (instancetype)initWithModel:(MyModel *)myModel {
MyViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"MyViewController"];
vc.model = myModel;
return vc;
}