【问题标题】:"'Application tried to present modally an active controller" when presenting a view controller via a Gesture Recognizer通过手势识别器呈现视图控制器时,“应用程序试图以模态方式呈现活动控制器”
【发布时间】:2023-03-18 03:00:01
【问题描述】:

我遇到了这个奇怪的问题,过去几个小时我一直在尝试解决它,但没有成功。

当用户在导航栏中点击UIBarButtonItem 时,我有一个UISearchController。按钮是用 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 以使代码相关。其他 if 仅检查其他操作,因此它们不会被调用)。

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

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

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

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

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

【问题讨论】:

  • 您是否尝试过添加print 语句或一般调试performSearchCollectionMagnifierGlassAction?可能是由于某种原因该方法被多次调用。
  • 看起来是这样的。想知道为什么我没有在那里记录任何东西来查看,但它至少被调用了两次。谢谢大家,请随时添加它作为答案。

标签: ios uigesturerecognizer modalviewcontroller presentviewcontroller


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2022-01-11
    • 2013-12-18
    • 2014-03-03
    • 2013-02-15
    相关资源
    最近更新 更多