通过手势识别器呈现视图控制器时"'Application tried to present modally an active controller"



我遇到了这个奇怪的问题,在过去的几个小时里我一直在试图解决这个问题,但没有运气。

我有一个UISearchController,当用户点击导航栏中的UIBarButtonItem时会显示。该按钮是使用 IB 创建的,然后连接到其 IBAction,即:

@IBAction func searchButtonTapped(sender: UIBarButtonItem) {
    searchController.active = true
    self.presentViewController(searchController, animated: true, completion: nil)
}

它工作得很好。视图控制器显示,用户可以键入内容。

除了简单地点击搜索栏按钮项之外,我还想通过使用该按钮为用户提供更多功能。也就是说,我希望他们能够长按它并用力触摸它以在我的应用程序中执行不同的操作。

在对SO进行了一段时间的黑客攻击和搜索之后(并且因为UIBarButtonItem本身不是视图...),我找到了一种方法来添加一些手势识别器搜索栏按钮项。我在viewDidLoad方法中添加了这个。

if let searchBarButtonView = self.searchBarButtonItem.valueForKey("view") as? UIView where searchBarButtonView.respondsToSelector("addGestureRecognizer:") {
    if Settings.searchCollectionMagnifierGlassIconLongPressAction != .None {
        let longTapGr = UILongPressGestureRecognizer(target: self, action: "handleSearchBarButtonLongPressGesture:")
        longTapGr.minimumPressDuration = CFTimeInterval(Settings.searchCollectionMagnifierGlassIconLongPressActionTime)
        longTapGr.delegate = self
        searchBarButtonView.addGestureRecognizer(longTapGr)
    }
    if Settings.searchCollectionMagnifierGlassIconForceTouchAction != .None {
        let forceTouchGr = DFContinuousForceTouchGestureRecognizer()
        forceTouchGr.forceTouchDelegate = self
        forceTouchGr.triggeringForceTouchPressure = 2.0
        searchBarButtonView.addGestureRecognizer(forceTouchGr)
    }
}

您可以忽略与此问题相关的所有强制触摸,因为我专注于首先使长按工作。

手势识别器工作正常。对于长按手势识别器,这是handleSearchBarButtonLongPressGesture:的实现:

func handleSearchBarButtonLongPressGesture(recognizer: UILongPressGestureRecognizer) {
    self.performSearchCollectionMagnifierGlassAction(Settings.searchCollectionMagnifierGlassIconLongPressAction)
}

这是performSearchCollectionMagnifierGlassAction的实现:

func performSearchCollectionMagnifierGlassAction(action: Settings.SearchCollectionMagnifierGlassIconAction) {
    let action = Settings.searchCollectionMagnifierGlassIconLongPressAction
    if action == .ClearOldQueryAndSearch {
        self.searchController.searchBar.text = ""
        self.searchButtonTapped(self.searchBarButtonItem) // This is exactly as if the user tapped the search bar button item on his own... But it crashes when it gets called as a result of a gesture recognizer!
    }
}

(我在这里删除了其他 if,以使代码相关。其他 ifs 仅检查其他操作,因此它们不会被调用)。

长按我的搜索栏按钮工作正常。但是该应用程序崩溃并显示:

由于未捕获的异常"NSInvalidArgumentException"而终止应用程序,原因:"应用程序试图呈现 模态上是主动控制器

如果我只是点击搜索按钮,应用程序就不会崩溃。我可以根据需要多次显示和隐藏UISearchController。如您所见,长按搜索按钮将完全按照通常点击按钮的作用执行操作,除了它在显示文本字段之前清除文本字段。我尝试注释掉清空搜索栏的行,但仍然发生崩溃。考虑到在长按和简单点击搜索按钮时调用几乎完全相同的代码,我倾向于认为这是崩溃,奇怪的是,可能与手势识别器有关。

我还尝试在清除搜索栏并再次显示搜索之前关闭搜索控制器,即使它不存在。没有运气。

最后,我将代码从searchButtonTapped复制并粘贴到performSearchCollectionMagnifierGlassAction。那里也没有运气。

您的searchButtonTapped方法被调用了两次:在长按手势处理程序中,以及直接在UIBarButtonItem的视图发出修饰事件时调用。

尝试注释掉您的searchButtonTapped调用或将longTapGr的属性设置为 true cancelsTouchesInView

相关内容

最新更新