代码之家  ›  专栏  ›  技术社区  ›  Sunkas

带有大标题的uisearchcontroller在选项卡栏中崩溃,原因是“只有一个具有顶部边界的调色板可以在转换外部处于活动状态”

  •  3
  • Sunkas  · 技术社区  · 6 年前

    在uitabbarcontroller中有多个选项卡。它们都有一个大标题的uinavigationbar和一个ios-11内置的搜索栏。但是,在选项卡之间切换会使应用程序崩溃

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
    'Only one palette with a top boundary edge can be active outside of a transition. Current active palette is 
    <_UINavigationControllerManagedSearchPalette: 0x7fc399b49980; frame = (0 96; 375 52); layer = <CALayer: 0x60c0004383a0>>'
    

    我已经测试了这里发布的解决方法: https://stackoverflow.com/a/46382723/511299 没有成功。这个问题没有使用uitabbarcontroller。

    我已将此代码添加到 viewDidAppear 以下内容:

    DispatchQueue.main.async {
        let searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        self.navigationItem.searchController = searchController
    }
    

    把这个给 viewWillDisappear 以下内容:

    self.navigationItem.searchController = nil
    

    将打印添加到每个方法以检查顺序在将其设置到显示视图之前,将验证该顺序是否为零。

    从表0转到表1,然后返回表0后,它崩溃。我甚至不需要向下滚动来显示搜索栏。

    完整堆栈跟踪:

    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Only one palette with a top boundary edge can be active outside of a transition. Current active palette is <_UINavigationControllerManagedSearchPalette: 0x7fea7dcaf880; frame = (0 44; 375 52); layer = <CALayer: 0x60000062ac20>>'
    *** First throw call stack:
    (
    0   CoreFoundation                      0x000000010b8381e6 __exceptionPreprocess + 294
    1   libobjc.A.dylib                     0x0000000109cda031 objc_exception_throw + 48
    2   CoreFoundation                      0x000000010b8ad975 +[NSException raise:format:] + 197
    3   UIKit                               0x000000010e67dec6 -[UINavigationController(_UIPalette) attachPalette:isPinned:] + 521
    4   UIKit                               0x000000010e659afd -[UINavigationController _createAndAttachSearchPaletteForTopViewControllerIfNecessary:] + 585
    5   UIKit                               0x000000010e677c10 -[UINavigationController _navigationItemDidUpdateSearchController:oldSearchController:] + 419
    6   UIKit                               0x000000010f0737a1 -[_UINavigationBarVisualProviderModernIOS navigationItemUpdatedSearchController:oldSearchController:animated:] + 160
    7   UIKit                               0x000000010edf15c4 -[UINavigationItem setSearchController:] + 135
    8   Appmost                             0x0000000107e5902e _T07Appmost25JsonCreatedViewControllerC14setupSearchBaryyFyycfU_ + 1486
    9   Appmost                             0x0000000107e590cd _T07Appmost25JsonCreatedViewControllerC14setupSearchBaryyFyycfU_TA + 13
    10  Appmost                             0x0000000107cbcb7d _T0Ieg_IeyB_TR + 45
    11  libdispatch.dylib                   0x00000001124c97ab _dispatch_call_block_and_release + 12
    12  libdispatch.dylib                   0x00000001124ca7ec _dispatch_client_callout + 8
    13  libdispatch.dylib                   0x00000001124d58cf _dispatch_main_queue_callback_4CF + 628
    14  CoreFoundation                      0x000000010b7fac99 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    15  CoreFoundation                      0x000000010b7beea6 __CFRunLoopRun + 2342
    16  CoreFoundation                      0x000000010b7be30b CFRunLoopRunSpecific + 635
    17  GraphicsServices                    0x0000000113adaa73 GSEventRunModal + 62
    18  UIKit                               0x000000010e482057 UIApplicationMain + 159
    19  Appmost                             0x0000000107f72167 main + 55
    20  libdyld.dylib                       0x0000000112547955 start + 1
    )
    libc++abi.dylib: terminating with uncaught exception of type NSExceptio
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   arunjos007    6 年前

    我试着重新创建这个问题,但是当我把代码添加到 func viewDidLoad()

    下面是在ios11中添加搜索视图控制器的代码

        if #available(iOS 11.0, *) {
            //Setup Search Controller
            self.searchController.obscuresBackgroundDuringPresentation = false
            self.searchController.searchBar.placeholder = "Search"
            self.searchController.searchBar.barStyle = .black
            self.searchController.searchBar.delegate = self
            self.definesPresentationContext = true
            self.navigationItem.searchController = searchController
            self.navigationItem.title = "Heading 2"
        }
    

    我还为您创建了一个演示项目,请在 Github Here

        2
  •  0
  •   shiju86.v    6 年前

    我已经在viewdidload()中添加了这段代码,它正在工作

    尝试添加以下代码行:

    searchController.dimsBackgroundDuringPresentation
    
        3
  •  0
  •   Zain Anjum    5 年前

    这些线解决了我的问题。

    let search = UISearchController(searchResultsController: nil)
        search.obscuresBackgroundDuringPresentation = false
        self.definesPresentationContext = true