在过去的几个小时里,我一直坚持这一点,似乎无法在任何地方找到解决方案。在我的UIPageViewController子类显示的第一个视图控制器上滑动后,应用程序崩溃,异常为'NSInternalInconsistencyException', reason: 'Unexpected subviews'
。我真的不明白它的含义以及我应该如何解决错误。调用堆栈如下:
0 CoreFoundation 0x00000001123561ab __exceptionPreprocess + 171
1 libobjc.A.dylib 0x00000001119ebf41 objc_exception_throw + 48
2 CoreFoundation 0x000000011235b372 +[NSException raise:format:arguments:] + 98
3 Foundation 0x0000000111490089 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
4 UIKit 0x000000011565c2e1 -[_UIQueuingScrollView _setWrappedViewAtIndex:withView:] + 377
5 UIKit 0x000000011565ca09 -[_UIQueuingScrollView _replaceViews:updatingContents:adjustContentInsets:animated:] + 734
6 UIKit 0x000000011565d00f -[_UIQueuingScrollView _viewAtIndex:loadingIfNecessary:updatingContents:animated:] + 379
7 UIKit 0x0000000115660664 __54-[_UIQueuingScrollView _didScrollWithAnimation:force:]_block_invoke + 109
8 UIKit 0x00000001156602e8 -[_UIQueuingScrollView _didScrollWithAnimation:force:] + 534
9 UIKit 0x000000011565b9f3 -[_UIQueuingScrollView layoutSubviews] + 179
10 UIKit 0x0000000114c746f5 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1439
11 QuartzCore 0x0000000117f483ee -[CALayer layoutSublayers] + 153
12 QuartzCore 0x0000000117f4c4dd _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 401
13 QuartzCore 0x0000000117ed4ded _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 365
14 QuartzCore 0x0000000117f00704 _ZN2CA11Transaction6commitEv + 500
15 QuartzCore 0x0000000117f01450 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 76
16 CoreFoundation 0x00000001122f8d37 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
17 CoreFoundation 0x00000001122f8c8e __CFRunLoopDoObservers + 430
18 CoreFoundation 0x00000001122dc9db CFRunLoopRunSpecific + 443
19 GraphicsServices 0x000000011780c9c6 GSEventRunModal + 62
20 UIKit 0x0000000114ba35e8 UIApplicationMain + 159
21 ExponentiallyMe 0x000000010f891167 main + 55
22 libdyld.dylib 0x0000000113b54d81 start + 1
23 ??? 0x0000000000000002 0x0 + 2
错误是通过它的外观在调用[_UIQueuingScrollView _setWrappedViewAtIndex:withView:] + 377
中引发的,我不知道为什么。下面是viewDidLoad()
的代码和UIPageViewControllerDataSource Protocol的两个必需方法。
viewDidLoad中()
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
self.delegate = self
self.activityIndicator("Loading Survey.")
self.pageControl.frame = CGRect()
self.pageControl.currentPageIndicatorTintColor = UIColor.white
self.pageControl.pageIndicatorTintColor = UIColor.lightGray
self.pageControl.currentPage = 0
self.view.addSubview(self.pageControl)
self.pageControl.translatesAutoresizingMaskIntoConstraints = false
self.pageControl.bottomAnchor.constraint(equalTo: self.view.topAnchor, constant: -20).isActive = true
self.pageControl.widthAnchor.constraint(equalTo: self.view.widthAnchor, constant: -20).isActive = true
self.pageControl.heightAnchor.constraint(equalToConstant: 20).isActive = true
self.pageControl.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
if self.selectedSurveyType == EMSurveyType.EMST_VISA {
self.pageControl.numberOfPages = 12
} else {
self.pageControl.numberOfPages = 2
}
setViewControllers([self.instructionView], direction: .forward, animated: true, completion: nil)
}
UIPageViewControllerDataSource协议方法
// Get the previous ViewController
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard self.currentPageIndex - 1 > 0 else {
if self.currentPageIndex - 1 == 0 {
self.currentPageIndex = 0
return self.instructionView
} else {
return nil
}
}
self.currentPageIndex -= 1
return self.questionViewControllerAtIndex(self.currentPageIndex - 1)
}
// Get the next ViewController
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard self.currentPageIndex + 1 <= self.questionCount else {
if self.currentPageIndex == self.questionCount {
self.currentPageIndex = self.questionCount + 1
return completionView
} else {
return nil
}
}
self.currentPageIndex += 1
return self.questionViewControllerAtIndex(self.currentPageIndex - 1)
}
从UITabBarController中的UIViewController以模态方式呈现子类UIPageViewController也可能会有所帮助。此外,questionViewControllers
在函数中创建:
func questionViewControllerAtIndex(_ index: Int) -> UIViewController {
let storyboard = UIStoryboard(name:"Main", bundle: nil)
let qVC = storyboard.instantiateViewController(withIdentifier: "EMSQuestionViewController") as! EMSurveyQuestionViewController
qVC.questionProperties(questionStatement: self.mainSurveyQuestions[index], subStatements: self.subStatementsForSurveyQuestions[index])
return qVC
}
非常感谢您提前,我对此非常感到失望,并且不了解可能导致问题的原因。任何帮助或指示我在正确的方向&#34;非常感谢,如果您需要任何进一步的信息/代码,请告诉我。
答案 0 :(得分:0)
所以对于后来读到这篇文章的人来说,我似乎已经解决了这个问题。我不太确定这种方法是如何工作的,但不是前一种方法(如果有人可以启发我,那会很棒),但似乎试图跟踪当前页面索引并在运行中创建视图控制器不工作。我重新编写了viewDidLoad()
来创建一个数组allPages
,它掌握了所有页面。然后在两个协议方法中,我不是检查当前位置的self.currentPageIndex
,而是根据传递的viewController
实例评估当前索引,并使用allPages
数组检查索引allPages.index(of: viewController)
。基于该值,我检查然后通过将index
的值增加或减少1来传递所需的视图控制器。对于前一个,返回基于return allPages[index! - 1]
。我希望这可能有助于将来绊倒这个问题的人,如果有人可以告诉我为什么这个有效,但不是我以前的方法,那也会很棒。
答案 1 :(得分:0)
如果您的页面视图控制器提供了另一个视图控制器,则会发生这种情况。
一个简单的解决方法是简单地消除viewWillDisappear
中所有可能出现的视图控制器:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
searchController?.dismiss(animated: true, completion: nil)
}