【问题标题】:How to call a function related to a specific UITextField?如何调用与特定 UITextField 相关的函数?
【发布时间】:2017-01-24 02:04:58
【问题描述】:

我对 Swift 和 Xcode 还很陌生,所以请多多包涵。

我有一个 UIViewController 用于创建帐户屏幕,其中有 4 个 UITextFields。当键盘出现时,前 3 个可以很好地编辑,但最后一个需要按下 UIView 以便可见。

我已经安装了 Cocoapod IHKeyboardAvoiding,它工作得很好,只有当我点击前三个 UITextfields 时,屏幕才会向上推。其伪代码是:'当点击确认密码文本字段时,应该发生键盘推送。当点击所有其他文本字段时,不应发生键盘按下。'

我不确定如何将伪代码实现为实际的 swift 代码。我为确认密码文本字段创建了一个 IBAction,并在其中实现了键盘推送代码。这可行,但只要点击确认密码文本字段,然后点击另一个文本字段,键盘推送就会应用于所有文本字段。我认为需要在 viewDidLoad 中调用该函数,但在 viewDidLoad 中不能有 IBAction 函数。

调用函数的最佳方式是什么?

import UIKit
import IHKeyboardAvoiding

class LoginViewController: UIViewController {

@IBOutlet var avoidingView: UIView!

@IBAction func confirmPassword(_ sender: UITextField) {
      KeyboardAvoiding.avoidingView = self.avoidingView
}


override func viewDidLoad() {
    super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

【问题讨论】:

  • 在我看来,你不需要为这么简单的事情使用 cocoapod。在没有 cocoapod 的情况下,它实际上是 2 行代码。如果你有兴趣,我可以告诉你怎么做。
  • 当然@DevKyle 我很想知道你会如何处理这个

标签: ios swift uitextfield ibaction


【解决方案1】:
  1. 首先您要设置您的类以符合 UITextFieldDelegate

所以在你的情况下,

class LoginViewController: UIViewController, UITextFieldDelegate {
  1. 然后,按照上面的 CodeBender 描述设置标签。您只需要为您想要移动屏幕的第 4 个文本字段执行此操作。

  2. 将所有 4 个文本字段的委托设置为 self。例如,如果您的文本字段被命名为一、二、三、四

    one.delegate = self
    two.delegate = self
    three.delegate = self
    four.delegate = self
    //Change the return key to Done so that tapping it dismisses keyboard
    four.returnKeyType = .done
    
  3. 将以下内容添加到您的课程中:

    func textFieldDidBeginEditing(_ textField: UITextField) {
    
        if textField.tag == 1 {
    
            UIView.animate(withDuration: 0.3, animations: {
    
                self.view.frame.origin.y -= 224
    
            }) 
    
        }
    }
    
    
    
    func textFieldShouldEndEditing(_ textField: UITextField) {
    
        textField.resignFirstResponder()
    
        if textField.tag == 1 {
    
            UIView.animate(withDuration: 0.3, animations: {
    
                self.view.frame.origin.y += 224
    
            }) 
    
        }
    
    }
    

应该可以,如果遇到任何问题,请告诉我!

【讨论】:

    【解决方案2】:

    获取您的密码文本字段并对其应用标签值,如下所示:

    passwordTextfield.tag = 1
    

    如果您还没有将文本字段连接到视图控制器,您也可以在情节提要文件中设置值:

    然后,在您的 confirmPassword 函数中,检查标签值:

    if (sender.tag == 1) { ... }
    

    【讨论】:

    • 我在情节提要文件中添加了 1 标签,但代码不起作用。这是我应该写的吗? @IBAction func confirmPassword(_ sender: UITextField) { if (sender.tag == 1){ KeyboardAvoiding.avoidingView = self.avoidingView } }
    • @EmmaCampbell 看起来不错。您可以在该函数中放置断点以查看传入的值以确保它们正确。
    • 此代码有效,但是一旦点击确认密码文本字段并且我点击另一个文本字段,推送也会应用到它。您对更改它以使其他文本字段不继承推送的最佳方法有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2020-07-15
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2012-04-09
    相关资源
    最近更新 更多