iOS 11 UIWebView下拉菜单在iPad上彻底破坏 - UIPopoverController

时间:2017-09-23 09:18:15

标签: ipad uiwebview dropdown uipopovercontroller ios11

使用HTML select元素时,UIWebView在iPad上显示原生UIPopoverController下拉列表(iPhone使用UIPickerView,效果很好。)

在iOS11上,这似乎完全被打破了:

  • 单击外部下拉列表以在不选择选项的情况下关闭,导致弹出框被关闭并立即重新呈现,偶尔为空
  • 如果页面上有多个下拉列表,则下拉新列表包含上一个列表中的元素
  • 选择第二个下拉列表时,首先重新打开
  • 偶尔会出现左下角的下拉(可能是丢失了它的源视图)
  • 上述步骤偶尔会导致以下崩溃:
  

2017-09-23 09:43:13.190728 + 0100 Web [1779:86622] *终止应用   由于未被捕获的异常' NSInternalInconsistencyException',原因:   ' UITableView数据源未设置'   * 第一次抛出调用堆栈:(0 CoreFoundation 0x000000010d4a01cb exceptionPreprocess + 171 1 libobjc.A.dylib
  0x000000010c8bbf41 objc_exception_throw + 48 2 CoreFoundation
  0x000000010d4a5362 + [NSException raise:format:arguments:] + 98 3
  基金会0x000000010c360089    - [NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193 4
  UIKit 0x000000010da742f5 - [UITableView   _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 1756 5 UIKit 0x000000010da7451a - [UITableView   _createPreparedCellForRowAtIndexPath:willDisplay:] + 81 6 UIKit 0x000000010da82137 - [UITableView _heightForRowAtIndexPath:] + 208 7
  UIKit 0x000000010dd2b939    - [UISectionRowData heightForRow:inSection:canGuess:] + 259 8 UIKit 0x000000010dd31c1a - [UITableViewRowData   heightForRow:inSection:canGuess:adjustForReorderedRow:] + 277 9
  UIKit 0x000000010dd36230    - [UITableViewRowData ensureHeightsFaultedInForScrollToIndexPath:withScrollPosition:boundsHeight:]   + 964 10 UIKit 0x000000010da51110 - [UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:usingPresentationValues:]   + 2783 11 UIKit 0x000000010da51b8f - [UITableView _scrollToRowAtIndexPath:atScrollPosition:animated:usingPresentationValues:]   + 146 12 UIKit 0x000000010da51a11 - [UITableView scrollToRowAtIndexPath:atScrollPosition:animated:] + 123 13 UIKit 0x000000010de72d11    - [UIWebSelectTableViewController viewWillAppear:] + 247 14 UIKit 0x000000010dabe9b0 - [UIViewController   _setViewAppearState:isAnimating:] + 444 15 UIKit 0x000000010dabf245 - [UIViewController __viewWillAppear:] + 147 16   UIKit 0x000000010da8b881   __56- [UIPresentationController runTransitionForCurrentState] _block_invoke + 1088 17 UIKit
  0x000000010d926c61 _runAfterCACommitDeferredBlocks + 318 18 UIKit
  0x000000010d91530d _cleanUpAfterCAFlushAndRunDeferredBlocks + 280 19   UIKit 0x000000010d945600   _afterCACommitHandler + 137 20 CoreFoundation 0x000000010d442db7   __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION
+ 23 21 CoreFoundation 0x000000010d442d0e   __CFRunLoopDoObservers + 430 22 CoreFoundation 0x000000010d427324 __CFRunLoopRun + 1572 23 CoreFoundation
  0x000000010d426a89 CFRunLoopRunSpecific + 409 24图形服务
  0x00000001124c89c6 GSEventRunModal + 62 25 UIKit
  0x000000010d91ad30 UIApplicationMain + 159 26 Web
  0x000000010bfb014f main + 111 27 libdyld.dylib
  0x0000000110df1d81 start + 1 28 ???   0x0000000000000001 0x0 + 1`

我创建了一个示例应用程序,其中包含一行代码,用于演示此问题:

https://github.com/AshRobinson/BrokenUIWebView

http://gph.is/2xmHFWs

是否有人针对此类问题采取了解决方法?在此阶段,我们无法迁移到WKWebview

有没有办法迫使iPad临时使用UIPickerView下拉菜单?

我已经调查了其他堆栈溢出帖子中没有运气的建议,例如:

ios 11 Beta 5 select drop-down list issue

2 个答案:

答案 0 :(得分:1)

我们遇到了同样的错误。 Apple's documentation表示iOS 8+应用程序应该使用WKWebView。一旦我们切换到WKWebView,我们就不再看到这个问题了。

答案 1 :(得分:0)

我遇到了这个问题,WKWebView被直接添加到UIWindow中。我的问题是视图没有链接到它的UIViewcontroller,所以以下几行做了诀窍:

containerVC = [[UIViewController alloc] init];
[containerVC.view addSubview:myWkWebview];
[window addSubview:containerVC.view];

而不是直接向窗口添加myWkWebview。有了这个,再次添加了模态视图: - )