ios - texto - xcode for windows




Alternando entre os campos de texto ao pressionar a tecla de retorno no Swift (10)

Apenas use o método becomeFirstResponder() da classe UIResponder em seu método textFieldShouldReturn . Todos os objetos do UIView são subclasses do UIResponder .

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if let nextField = self.view.viewWithTag(textField.tag + 1) as? UITextField {
        nextField.becomeFirstResponder()
    } else {
        textField.resignFirstResponder()
    }
    return false
}

Você pode encontrar mais informações sobre o método becomeFirstResponder() no Apple Doc's here .

Estou projetando um aplicativo iOS e quero que quando a tecla de retorno for pressionada no meu iPhone, ele me direcione para o próximo campo de texto seguinte.

Eu encontrei um par de perguntas semelhantes, com excelentes respostas ao redor, mas todas elas estão em Objective-C e estou procurando código Swift, agora é isso que eu tenho até agora:

func textFieldShouldReturn(emaillabel: UITextField) -> Bool{
    return true
}

Ele é colocado no arquivo que está conectado e no controlador do UIView que contém os campos de texto, mas não tenho certeza se esse é o lugar certo.

Eu sou basicamente novo em Swift, então explique cada pequeno passo ou eu vou conseguir estragar tudo de alguma forma. Também estou usando a versão mais recente do Xcode, se isso faz alguma diferença.

Ok, então eu tentei isso e recebi este erro:
//could not find an overload for '!=' that accepts the supplied arguments

func textFieldShouldReturn(textField: UITextField) -> Bool {
    let nextTag: NSInteger = textField.tag + 1
    // Try to find next responder
    let nextResponder: UIResponder = textField.superview!.viewWithTag(nextTag)!
    if (nextResponder != nil) {
        // could not find an overload for '!=' that accepts the supplied arguments

        // Found next responder, so set it.
        nextResponder.becomeFirstResponder()
    } else {
        // Not found, so remove keyboard.
        textField.resignFirstResponder()
    }
    return false // We do not want UITextField to insert line-breaks.
}

Obrigado antecipadamente amigos!


Certifique-se de que seus delegados UITextField estejam configurados e que as tags sejam incrementadas corretamente. Isso também pode ser feito através do Interface Builder.

Aqui está um link para uma postagem do Obj-C que eu encontrei: Como navegar pelos campos de texto (botões Next / Done)

class ViewController: UIViewController,UITextFieldDelegate 
{
   //Link each UITextField
   @IBOutlet weak var textField: UITextField!

   override func viewDidLoad() 
   {
      super.viewDidLoad()
      // Do this for each UITextField
      textField.delegate = self
      textField.tag = 0 //Increment accordingly
   }

   func textFieldShouldReturn(_ textField: UITextField) -> Bool 
   {
      // Try to find next responder
      if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
         nextField.becomeFirstResponder()
      } else {
         // Not found, so remove keyboard.
         textField.resignFirstResponder()
      }
      // Do not add a line break
      return false
   }
}

Eu sugiro que você use a instrução switch em textFieldShouldReturn(_:) .

class ViewController: UIViewController, UITextFieldDelegate {

  @IBOutlet weak var txtFieldName: UITextField!
  @IBOutlet weak var txtFieldEmail: UITextField!
  @IBOutlet weak var txtFieldPassword: UITextField!

  override func viewDidLoad() {
    super.viewDidLoad()

  }

  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if textField == txtFieldName {
       textField.resignFirstResponder()
       txtFieldEmail.becomeFirstResponder()
    } else if textField == txtFieldEmail {
       textField.resignFirstResponder()
       txtFieldPassword.becomeFirstResponder()
    } else if textField == txtFieldPassword {
       textField.resignFirstResponder()
    }
   return true
  }
}

Eu tenho uma boa solução para sua pergunta.

DEGRAU:

1 - Defina sua chave de retorno do storyboard.

2 - No seu arquivo rápido.

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField.returnKeyType == .next {
            Email.resignFirstResponder()
            Password.becomeFirstResponder()
        } else if textField.returnKeyType == .go {
            Password.resignFirstResponder()
            self.Login_Action()
        }
        return true
    }

3 - Não esqueça de definir o delegado do Textfield.

Obrigado :)


Nenhum especial, aqui é meu atualmente usando para alterar o textFiled. Então o código no ViewController parece ser bom :). # Swift4

func setNextResponder(_ fromCell: UITableViewCell) {
  if fromCell is MyTableViewCell, let nextCell = tableView.cellForRow(at: IndexPath(row: 1, section: 0)) as? MySecondTableViewCell {

    nextCell.aTextField?.becomeFirstResponder()

  } ....
}

Se você tem muitos componentes de campo de texto, pode ser melhor usar uma coleção de saída, vinculando campos de texto e definindo Return Key do construtor de interface

final class SomeTextFiled: UITextField {

  public var actionKeyboardReturn: (() -> ())?

  override init(frame: CGRect) {
      super.init(frame: frame)
      super.delegate = self
  }

  required init?(coder aDecoder: NSCoder) {
      super.init(coder: aDecoder)
      fatalError("init(coder:) has not been implemented")
  }

  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
      self.resignFirstResponder()
      actionKeyboardReturn?()
      return true
   }
}

extension SomeTextFiled: UITextFieldDelegate {}


class MyViewController : UIViewController {

    var tfName: SomeTextFiled!
    var tfEmail: SomeTextFiled!
    var tfPassword: SomeTextFiled!

    override func viewDidLoad() {
        super.viewDidLoad()
        tfName = SomeTextFiled(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        tfName.actionKeyboardReturn = { [weak self] in
            self?.tfEmail.becomeFirstResponder()
        }
        tfEmail = SomeTextFiled(frame: CGRect(x: 100, y: 0, width: 100, height: 100))
        tfEmail.actionKeyboardReturn = { [weak self] in
            self?.tfPassword.becomeFirstResponder()
        }
        tfPassword = SomeTextFiled(frame: CGRect(x: 200, y: 0, width: 100, height: 100))
        tfPassword.actionKeyboardReturn = {
            /// Do some further code
        }
    }
}

Versão do Caleb no Swift 4.0

override func viewDidLoad() {
        super.viewDidLoad()

        emailTextField.delegate = self
        passwordTextField.delegate = self
    }


    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == emailTextField {
            passwordTextField.becomeFirstResponder()
        }else {
            passwordTextField.resignFirstResponder()
        }
            return true
    }

PS textField.superview? não está funcionando para mim


a maneira mais fácil de mudar para o próximo texto Campo é isso não há necessidade de código longo

func textFieldShouldReturn(_ textField: UITextField) -> Bool

    {

        if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {

            nextField.becomeFirstResponder()

        } else {

            textField.resignFirstResponder()

            return true;

        }

        return false

    }

Swift 4.2

Esta é uma solução mais genérica e fácil , você pode usar este código com qualquer quantidade de TextFields. Apenas herde UITextFieldDelegate e atualize o Textfield Tag de acordo com o pedido e copie esta função

if self.emaillabel.isEqual(self.anotherTextField)
{
    self.anotherTextField.becomeFirstResponder()
}

Swift 5

Você pode facilmente mudar para outro TextField quando clicar em tecla de retorno no teclado.

  • Primeiro, seu view controller está em conformidade com UITextFieldDelegate e inclui o método delegado textFieldShouldReturn(_:) no ViewController
  • Arraste de TextField para ViewController no Interface Builder . Em seguida, selecione a opção delegate . Nota : Faça isso para todo o TextField
  • Crie um IBOutlet para todos os TextFields

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        let nextTag: NSInteger = textField.tag + 1
        // Try to find next responder
        let nextResponder = textField.superview!.viewWithTag(nextTag)
        if (nextResponder != nil) {
            // could not find an overload for '!=' that accepts the supplied arguments
    
            // Found next responder, so set it.
            nextResponder?.becomeFirstResponder()
        } else {
            // Not found, so remove keyboard.
            textField.resignFirstResponder()
        }
        return false // We do not want UITextField to insert line-breaks.
    }




xcode6