【问题标题】:My app crash everytime I add code to dismiss keyboard - Swift每次我添加代码以关闭键盘时,我的应用程序都会崩溃 - Swift
【发布时间】:2020-08-15 23:50:28
【问题描述】:

我正在使用 xCode 开发一个应用程序,并且我有一个 numberPad / decimalPad,当在任何地方点击屏幕时我需要关闭它。是整个屏幕上的单个文本输入。我在网上看到,我在 viewDidLoad 上得到了以下代码:

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
view.addGestureRecognizer(tap)

接下来我在 viewDidLoad 之后添加了这个函数

@objc func dismissKeyboard() {
    view.endEditing(true)
}

由于某种原因,我尝试了不同的方法,但在文本字段中插入值后点击屏幕时应用程序崩溃。

一直在网上到处寻找,但似乎没有任何东西可以解决这个问题。

我也会添加一个完成按钮和一个工具栏,但是 xCode 给了我错误,因为我还在学习还不能弄明白。

我正在运行最新版本的 xCode 并使用迄今为止可用的最新 Swift 版本进行编码。

有什么建议吗?

完整的崩溃日志:

2020-08-16 10:17:16.734232-0400 Melitus[10862:586552] 找不到支持 iPhone-PortraitTruffle-NumberPad 键盘类型 4 的键盘;使用 25764_PortraitTruffle_iPhone-Simple-Pad_Default 2020-08-16 10:17:16.767685-0400 Melitus[10862:586552] 找不到支持键盘 iPhone-PortraitTruffle-NumberPad 类型 4 的键盘;使用 25764_PortraitTruffle_iPhone-Simple-Pad_Default 2020-08-16 10:17:18.229188-0400 Melitus[10862:586552] -[Melitus.ViewController carbsLabel:]: 无法识别的选择器发送到实例 0x7fcc99f07b70 2020-08-16 44-27:44-24: 0400 Melitus [10862:586552] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[Melitus.ViewController carbsLabel:]:无法识别的选择器发送到实例 0x7fcc99f07b70”*** 第一次抛出调用堆栈:(0 CoreFoundation 0x00007fff23e3de6e __exceptionPreprocess + 350 1 libobjc.A.dylib 0x00007fff512539b2 objc_exception_throw + 48 2的CoreFoundation 0x00007fff23e5eb94 - [NSObject的(NSObject的)doesNotRecognizeSelector:] + 132 3 UIKitCore 0x00007fff49354af0 - [UIResponder doesNotRecognizeSelector:] + 302 4的CoreFoundation 0x00007fff23e4286c转发+ 1436 5的CoreFoundation 0x00007fff23e44b58 _CF_forwarding_prep_0 + 120 6 UIKitCore 0x00007fff49326c1d -[UIApplication sendAction:to:from:forEvent:] + 83 7 UIKitCore 0x00007fff48cd5baa -[UIContro升sendAction:至:forEvent:] + 223 8 UIKitCore 0x00007fff48cd5ef2 - [UIControl _sendActionsForEvents:withEvent:方法] + 396 9 UIKitCore 0x00007fff49632d69 - [的UITextField _resignFirstResponder] + 155 10 UIKitCore 0x00007fff49353dae - [UIResponder _finishResignFirstResponder] + 358 11 UIKitCore 0x00007fff496329af - [的UITextField _finishResignFirstResponder ] + 48 12 UIKitCore 0x00007fff49353f10 - [UIResponder resignFirstResponder] + 275 13 UIKitCore 0x00007fff49632829 - [的UITextField resignFirstResponder] + 93 14 UIKitCore 0x00007fff4964b0da - [UIView的(的UITextField)endEditing:] + 184 15 Melitus 0x000000010012311d $ sSo16UIViewControllerC7MelitusE15dismissKeyboardyyF + 205 16 Melitus 0x000000010012316b $ sSo16UIViewControllerC7MelitusE15dismissKeyboardyyFTo + 43 17 17 uikitcore 0x00007FFF48EB6358 - [UigestUreCognizertarget _SendActionWithEntarGognizer:] + 44 18 uikitcore 0x00007FFF48EC02BA _UIGESTURECOGNIZERERARGARTACTIONT + 109 19 UIKITCORE 0x00007FFF48EBCB89 _UIGESTURECOGNIZERANCTINGS + 295 20 U IKitCore 0x00007fff48ebbeda - [UIGestureRecognizer _updateGestureForActiveEvents] + 760 21 UIKitCore 0x00007fff48ead9cb _UIGestureEnvironmentUpdate + 2745 22 UIKitCore 0x00007fff48eaced4 - [UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 467 23 UIKitCore 0x00007fff48eacc5c - [UIGestureEnvironment _updateForEvent:窗口:] + 225 24 UIKitCore 0x00007fff49364277 - [的UIWindow的SendEvent :] + 4479 25 UIKitCore 0x00007fff4933e6d1 - [UIApplication的的SendEvent:] + 356 26 UIKitCore 0x00007fff493c94ce __dispatchPreprocessedEventFromEventQueue + 7628 27 UIKitCore 0x00007fff493cc692 __handleEventQueueInternal + 6584 28 UIKitCore 0x00007fff493c2f35 __handleHIDEventFetcherDrain + 88 29的CoreFoundation 0x00007fff23da1c91 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17 30的CoreFoundation 0x00007fff23da1bbc __CFRunLoopDoSource0 + 76 31的CoreFoundation 0x00007fff23da1394 __CFRunLoopDoSources0 + 180 32 核心基础 0x00007fff23d9bf8e __CFRunLoopRun + 974 33 核心基础 0x00007ff f23d9b8a4 cfrunlooprunpecific + 404 34图形服务0x00007fff38c39bbe gseventrunmodal + 139 35 uikitcore 0x00007fff49325968 Uiapplicationmain + 1605 36 melitus 0x0000000100128a2b main + 75 37 libdyld.dylib 0x00007fff520ce1fd start + 1 38 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: 以 NSException 类型的未捕获异常终止

【问题讨论】:

  • 你能发布崩溃日志吗?
  • 线程 1:异常:“-[Melitus.ViewController carbsLabel:]:无法识别的选择器发送到实例 0x7f9953e0ae70”
  • 这是 xCode 在点击键盘外的任意位置或按下工具栏上的“完成”按钮时出现的错误

标签: ios swift


【解决方案1】:

更新 2:我正在为 Xcode-playgrounds 添加一个示例供您试用,尝试使您的代码类似于以下代码或使以下代码类似于您以重现该问题。

import UIKit
import PlaygroundSupport

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        setupToHideKeyboardOnTapOnView()
    }
}
extension UIViewController {
    func setupToHideKeyboardOnTapOnView() {
        let tapOutside = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
        tapOutside.cancelsTouchesInView = false
        view.addGestureRecognizer(tapOutside)
    }

    @objc func dismissKeyboard() {
        print("dismissing...")
        view.endEditing(true)
    }
}
PlaygroundPage.current.setLiveView(ViewController())
PlaygroundPage.current.needsIndefiniteExecution = true

更新:您遇到的崩溃可能是由于同名的现有方法之间存在冲突。尝试重命名方法:

@objc func dismissMyKeyboard() {
    view.endEditing(true)
}

您应该使用#selector 而不是String 作为action 参数的参数。

替换:

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")

与:

let tap = UITapGestureRecognizer(target: self, action: #selector(dismissMyKeyboard))

【讨论】:

  • 我也尝试了你建议的方式。它也会发生同样的事情。是的,我尝试在 viewDidLoad 之后的 func 中添加 @objc。我不明白发生这种情况的原因。
  • 我没有任何其他方法与该方法的名称更接近。这是应用程序崩溃时 xCode 让我遇到的错误:线程 1:异常:“-[Melitus.ViewController carbsLabel:]: unrecognized selector sent to instance 0x7f9953e0ae70”
  • 我没有说这是你的方法。这是一个 UIKit 方法。您是否尝试过解决方案?
  • 我做到了!甚至创建了一个名称完全不同的扩展,但它仍然会发生。尝试了我在网上找到的多个不同的代码,并且它们都发生了同样的事情,并且都出现了相同的错误。甚至尝试添加完成按钮和工具栏,它也确实发生了。
  • 我已将完整的崩溃日志添加到讨论中,这样更容易分析正在发生的事情。
【解决方案2】:

两个步骤即可。

  • 在 viewDidLoad 函数中添加点击手势(使用选择器而不是字符串)
let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
view.addGestureRecognizer(tap)
  • 尝试使用resignFirstResponder
@objc func dismissKeyboard() {
    yourTextField.resignFirstResponder()
}

【讨论】:

  • 我一到家就试试这个解决方案,如果它对我有用,我会告诉你的!谢谢!
  • 当然。让我知道它是否有帮助
  • 它也使应用程序崩溃。我真的不明白这是怎么回事!
【解决方案3】:

问题终于解决了!

所以我厌倦了尝试不同的代码并决定删除我以前拥有的 TextField 并创建一个具有不同名称的新字段。令我惊讶的是,这解决了问题并允许我做我必须做的事情。只要我触摸屏幕上的任何位置,键盘就会被关闭,就像假设应用程序不会崩溃一样。

非常感谢所有试图解决我问题的人!

我会留下这个,所以如果有人通过同样的事情,可以尝试做和我一样的事情或查看其他答案。

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多