"'应用程序尝试以模态方式呈现一个活动控制器"通过手势识别器

时间:2016-01-16 20:20:13

标签: ios uigesturerecognizer modalviewcontroller presentviewcontroller

我有这个奇怪的问题,我一直试图在过去的几个小时内解决这个问题而没有运气。

当用户点按导航栏中的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!
    }
}

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

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

  

***由于未捕获的异常终止应用' NSInvalidArgumentException',原因:'应用程序试图呈现   模块化一个活动控制器

如果我只是点按搜索按钮,该应用就不会崩溃。我可以按照我希望的方式多次显示和隐藏UISearchController。您可以看到,长按搜索按钮将完全按照按钮执行的操作,除非它在显示之前清除文本字段。我试着评论清空searchBar的行,但崩溃仍然发生。考虑到在长时间点击和简单点击搜索按钮时几乎完全相同的代码被调用,我倾向于认为崩溃可能奇怪地与手势识别器相关。

我还尝试解除searchController,即使它在清除searchBar并再次显示之前不存在。没有运气。

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

1 个答案:

答案 0 :(得分:1)

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

尝试发表您的searchButtonTapped来电,或将cancelsTouchesInView的{​​{1}}属性设置为longTapGr