- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了这个奇怪的问题,过去几个小时我一直在努力解决它,但没有成功。
我有一个 UISearchController
,它会在用户点击导航栏中的 UIBarButtonItem
时显示。这个按钮是用 IB 创建的,然后连接到它的 IBAction,就是这个:
@IBAction func searchButtonTapped(sender: UIBarButtonItem) {
searchController.active = true
self.presentViewController(searchController, animated: true, completion: nil)
}
它工作得很好。 View Controller 出现,用户可以输入内容。
除了简单地点击搜索栏按钮项目外,我还想通过使用该按钮为用户提供更多功能。也就是说,我希望他们能够长按它并用力触摸它以在我的应用程序中执行不同的操作。
在对 SO 进行黑客攻击和搜索一段时间后(并且因为 UIBarButtonItem 本身不是一个 View ...),我找到了一种向搜索栏按钮项添加一些手势识别器的方法。我在我的 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 仅检查其他操作,因此它们不会被调用)。
长按我的搜索栏按钮效果很好。但是应用程序崩溃了:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller
如果我只是点击搜索按钮,应用程序不会崩溃。我可以根据需要多次显示和隐藏 UISearchController
。如您所见,长按搜索按钮将执行通常点击按钮的操作,除了它会在显示之前清除文本字段。我尝试注释掉清空 searchBar 的行,但崩溃仍然发生。考虑到在长按和轻按搜索按钮时几乎调用了完全相同的代码,我倾向于认为这次崩溃可能与手势识别器有关。
在清除 searchBar 并再次显示它之前,我也尝试过关闭 searchController,即使它不存在。运气不好。
最后,我将代码从 searchButtonTapped
复制并粘贴到 performSearchCollectionMagnifierGlassAction
。那里也没有运气。
最佳答案
您的 searchButtonTapped
方法被调用两次:在长按手势处理程序中以及在 UIBarButtonItem 的 View 发出触摸事件时直接调用。
尝试注释掉您的 searchButtonTapped
调用或将 longTapGr
的 cancelsTouchesInView
属性设置为 true
。
关于ios - "' 当通过手势识别器呈现 View Controller 时,应用程序试图以模态方式呈现事件 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34831703/
我是 C++ 的新手,我在使用这段代码时遇到了问题: string output_date(int day, int month, int year){ string date; if
所以我这样做了 tar cvzf test.zip FP 为了创建目录 FP 的 zip 但是,它会列出 zip 中的目录 FP/ FP/php/ FP/php/pdf/ FP/php/docs/ F
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我的测试用例是这样的: class FooTest extends PHPUnit_Framework_TestCase { /** @covers MyClass::bar */ f
我正在尝试将brew install wine作为使electron-builder工作的一步。但是我所能得到的只是以下响应: ==> Installing dependencies for wine
我这样做: string[,] string1 = {{"one", "0"},{"Two", "5"},{"Three","1"}}; int b = 0; for(int i = 0; i <=
我正在尝试使用 SetWindowsHookEx 键盘 Hook Notepad.exe。 如您所见,工作线程正在将其 ASCII 代码(即 wParam)发送到指定的服务器。 UINT WINAPI
我正在尝试将 ListView 实现到我的 Fragment 中,但无论我尝试什么,我都会得到一个 NullPointerException。我检查对象是否为 null 并记录是否为 null,看起来
我尝试在一行中对齐两个 div。使用 float left 属性,一切顺利。但是当我在 div 中使用图像时,它开始产生问题。 所以这是我的示例代码:- Some headi
我目前正在使用此代码来获取图像的灰度图像表示并以 (512, 370, 1) 的格式表示它大批。 img_instance = cv2.imread(df.iloc[i][x_col]) / 255.
总结 我正在创建一个简单的应用程序,它允许用户选择一个包含顶级窗口的进程。用户首先键入 native DLL(而非托管 DLL)的路径。然后用户键入将在 Hook 过程中调用的方法的名称。该方法不得返
我是一名优秀的程序员,十分优秀!