【问题标题】:How to use the keyboard "Go" to submit UITextFields like a UIButton in Swift 2如何使用键盘“Go”在 Swift 2 中像 UIButton 一样提交 UITextFields
【发布时间】:2015-09-18 09:43:48
【问题描述】:

好的,所以我有一个功能,允许我的用户使用键盘转到下一个字段(我从 SO 获得代码)它工作得很好。我的问题是,一旦我的用户到达最终的文本字段,我选择“GO”作为返回按钮,我想使用 go 作为理想的提交按钮。随着表单的流动,它看起来是正确的,但最后的功能不存在。我在这里找到了答案,但看起来它调用了与“下一个字段”代码相同的函数。所以他们不能很好地合作。下面是 Next Field 代码的样子:

override func viewDidLoad() {
    super.viewDidLoad()
    // Keyboard Next Field & Delegate
    enterEmailTextField.delegate = self
    enterPasswordTextField.delegate = self
    self.enterEmailTextField.nextField = self.enterPasswordTextField
    self.enterPasswordTextField.nextField = self.enterNameTextField
    // ...
}

下一个块显示在覆盖下方(我相信你知道)func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }

// Next Field
func textFieldShouldReturn(textField: UITextField) -> Bool {
    if let nextField = textField.nextField {
        nextField.becomeFirstResponder()
    }

    return true
}

好的,直到最后一个文本字段都可以正常工作,但是由于最后一个字段是“Go”,所以我试图模仿我会用@IBAction 来表示按钮,而不是 go 按钮。这是我得到 Go 工作的想法/代码的地方:

Action of the "Go" button of the ios keyboard

关于如何实现这些的任何想法?或者只是为了使用下一个函数,并实现类似于@IBaction 的“键盘启动”操作?也许只是一种更好的方式来实现这两者,使它们彼此一致?非常感谢任何帮助!

编辑!

我忘记了实际的 NextField.swift 文件,我确定它很重要(抱歉)

import Foundation
import UIKit

private var kAssociationKeyNextField: UInt8 = 0


extension UITextField {
    @IBOutlet var nextField: UITextField? {
        get {
            return objc_getAssociatedObject(self,     &kAssociationKeyNextField) as? UITextField
        }
         set(newField) {
            objc_setAssociatedObject(self, &kAssociationKeyNextField,     newField, UInt(OBJC_ASSOCIATION_RETAIN))
        }
    }
}

我认为这会很有帮助

【问题讨论】:

    标签: ios xcode swift ios8 swift2


    【解决方案1】:
    - (BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        if (textField.returnKeyType == UIReturnKeyNext) {
            // tab forward logic here
            return YES;
        }
        else if (textField.returnKeyType == UIReturnKeyGo) {
            // submit action here
            return YES;
        }
    
        return NO;
    }
    

    关于处理标签顺序和表单提交的更简洁的方式,请阅读我的回答 here

    【讨论】:

    • 快速问题:我应该把这个块放在哪里?我确定有一个函数可以用来多次使用此方法,但我应该把它放在哪里呢?感谢您的快速回复,我也阅读了您链接的答案
    • @Sin 您已经实现了您发布的代码示例中的方法。我个人会把它放在管理表单的视图控制器中。
    • 这里有点困惑,哈哈。我也要替换: // Next Field func textFieldShouldReturn(textField: UITextField) -> Bool { if let nextField = textField.nextField { nextField.becomeFirstResponder() } return true } with - (BOOL)textFieldShouldReturn:(UITextField *)textField { if (textField.returnKeyType == UIReturnKeyNext) { // tab forward logic here return YES; } else if (textField.returnKeyType == UIReturnKeyGo) { // submit action here return YES; } return NO; }
    • @Sin 我的代码是-textFieldShouldReturn: 的Objective-C 实现,也是您在示例中实现的方法。我让你把它转换成 Swift。
    【解决方案2】:

    首先将返回键设置为你的TextField的Go,然后实现以下方法:

    func textFieldShouldReturn(textField: UITextField) -> Bool {
          if (textField.returnKeyType == UIReturnKeyType.Go)
             {
                // Implement your IBAction method here
            }
          return true
     }
    

    然后看下图:

    【讨论】:

    • 我试过这个,我得到一个错误,我知道这是我的错,因为我没有得到它。我将您的第一个代码直接放在我的下一个字段代码下,我收到错误:'textFieldShouldReturn' 的重新声明无效。另外,我的 final 字段已经设置为“go”而不是 return。你能告诉我我做错了什么吗?
    • 首先设置断点并检查 textFieldShouldReturn 方法是否被调用?
    • @Sin 编译器告诉你所有你需要知道的。无效的重新声明。您两次声明了该方法。您应该替换当前的实现,而不是添加具有相同签名的第二种方法。
    • 谢谢@ChristianSchnorr 我不想问太多问题...我正在尝试自己解决问题,我觉得反复试验至少表明您正在尝试,而不依赖于每个角落的答案,但这对我来说很棘手。只是因为我试图让它与其他代码一起工作。我明白你对错误的看法,我不确定要替换什么
    【解决方案3】:

    适用于 SwiftUI 中的 iOS 15。您可以使用 .submitLabel(.go) 来完成。

    @available(iOS 15.0, *)
    struct TextFieldSubmitView: View {
        @Binding var name: String
    
        var body: some View {
            VStack(alignment: .leading) {
                TextField("Type text", text: $name)
                    .textFieldStyle(.roundedBorder)
                    .padding()
                #if os(iOS)
                    .submitLabel(.go)
                #endif
            }
        }
    }
    
    @available(iOS 15.0, *)
    struct TextFieldSubmitView_Previews: PreviewProvider {
        static var previews: some View {
            TextFieldSubmitView(name: .constant("Name"))
                .previewLayout(.sizeThatFits)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-22
      • 2013-07-28
      • 2015-01-06
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多