2015-08-01 7 views
27

Я разрабатываю приложение iOS, и я хочу, чтобы при нажатии клавиши возврата в моем iPhone она направляет меня в следующее следующее текстовое поле.Переключение между текстовыми полями при нажатии клавиши возврата в Swift

Я нашел несколько подобных вопросов, с отличными ответами вокруг, но все они просто оказались в Objective-C, и я ищу Swift код, теперь это не то, что я до сих пор:

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

Он помещается в файл, который подключен и контроллер к UIView, который содержит текстовые поля, но я не уверен, что это подходящее место.

Я в основном новичок в быстром, поэтому объясняю каждый маленький шаг, или мне удастся каким-то образом испортить его. Также я использую последнюю версию Xcode, если это имеет значение.

хорошо, поэтому я попытался это и получил эту ошибку:
//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. 
} 

Заранее спасибо приятелей !!

ответ

80

Swift 3,0 (проверка истории изменений для предыдущих версий):

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 
    } 
} 

Убедитесь, что UITextField делегатов установлены и теги увеличивается должным образом. Это также можно сделать с помощью Interface Builder.

Вот ссылка на пост Obj-C я нашел: How to navigate through textfields (Next/Done Buttons)

+0

Как бы я поставил их, я так новый в этом и совсем потерял в тот момент, если честно –

+1

К «им» я буду считать, что вы имеете в виду делегатов. Самый простой способ - сделать это через IB. Перейдите в свою раскадровку -> Щелкните на каждом элементе UITextField-> Drag на желтый значок ViewController.Если вы имели в виду теги, то вы также можете сделать это через IB. Нажмите на каждый UITextField и установите теги, начинающиеся с 0, и увеличивайте их на 1. Вы также можете программным образом установить делегаты и теги в представлении ViewControllers viewDidLoad, установив textField.delegate = self и textField.tag = n – Caleb

+0

в порядке, поэтому я попробовал это и я получил пару ошибок: –

2

Просто используйте метод класса UIResponder в вашем методе textFieldShouldReturn. Каждый объект UIView - это подклассы UIResponder.

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

Вы можете найти более подробную информацию о becomeFirstResponder() методе в компании Apple Док в here.

6

Этого подход нуждается в некоторых изменениях в представлениях таблиц и представлениях коллекции, но это нормально для простых форм, которые я предполагаю.

Подключите ваш textFields к одному IBOutletCollection, разбирайтесь его координаты у и в textFieldShouldReturn(_:) просто перейти к следующему текстовому полю, пока вы не дойдете до конца:

@IBOutlet var textFields: [UITextField]! 

... 

textFields.sortInPlace { $0.frame.origin.y < $1.frame.origin.y } 

... 

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    if let currentIndex = textFields.indexOf(textField) where currentIndex < textFields.count-1 { 
     textFields[currentIndex+1].becomeFirstResponder() 
    } else { 
     textField.resignFirstResponder() 
    } 
    return true 
}  

Или просто посмотреть на sample project (Xcode 7 бета-4)

+0

Я не очень уверен, что понимаю часть координат, которую вы могли бы объяснить, пожалуйста? –

+1

уверен. Вы хотите прыгать с одного сверху на тот, что находится на самом дне. Таким образом, вы сортируете его по координате y в массиве, поэтому в массиве [0] находится один сверху, массив [1] один под ним, а массив [последний] - тот, что внизу. Этого достаточно? – libec

4

Я пробовал много кодов и, наконец, это работает для меня в Swift 3.0 Последнее [март 2017]

«ViewContro ller "класс должен унаследовать" UITextFieldDelegate "для создания этого кода.

class ViewController: UIViewController,UITextFieldDelegate 

Добавьте текстовое поле с Надлежащей Tag Nuber и этот номер используется тег, чтобы взять контроль в соответствующее текстовом поле на основе дополнительного числа тегов, возложенное на него.

override func viewDidLoad() { 

userNameTextField.delegate = self 

     userNameTextField.tag = 0 

     userNameTextField.returnKeyType = UIReturnKeyType.next 

     passwordTextField.delegate = self 

     passwordTextField.tag = 1 


     passwordTextField.returnKeyType = UIReturnKeyType.go 

} 

В приведенном выше коде, «returnKeyType = UIReturnKeyType.next», где будет сделать ключ ключ возврата подушечка для отображения в качестве «Next» вы также есть и другие варианты, как «Регистрация/Go» и т.д., на основе вашего приложение изменит значения.

Это «textFieldShouldReturn» представляет собой метод UITextFieldDelegate под контролем и здесь мы имеем следующий выбор полей на основе значения Tag приращением

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 

    } 
0

Альтернативный метод для пуристов, которые не любят с помощью тегов, и хочет UITextField делегат быть клеткой, чтобы держать компоненты раздельно или однонаправленные ...

  1. Создать новый протокол связать ячейки и TableViewController.

    protocol CellResponder { 
        func setNextResponder(_ fromCell: UITableViewCell) 
    } 
    
  2. Добавить протокол в камеру, где ваш TextField Делегат также является клетка (я это делаю в раскадровку).

    class MyTableViewCell: UITableViewCell, UITextFieldDelegate { 
        var responder: CellResponder? 
    
        func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
        responder?.setNextResponder(self) 
        return true 
        } 
    } 
    
  3. Сделайте TableViewController соответствовать протоколу CellResponder (т.е. class MyTableViewController: UITableViewController, CellResponder) и реализовать метод, как вы хотите. То есть если у вас есть различные типы клеток, то вы можете сделать это, также можно передать в IndexPath, используйте тег, и т.д .. Не забудьте установить cell.responder = self в cellForRow ..

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

самый простой способом изменить к следующему текстовому полю не является в этом нет необходимости для длинного кода

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 
    } 
4

Swift 4

Вы можете легко переключиться на другую Tex TField.

  • Добавить UITextFieldDelegate и добавить textFieldShouldReturn(_:) метод в ViewController
  • Drag от TextField в ViewController в Interface Builder. Затем выберите delegate собственности. Примечание: Сделайте это для всех TextField
  • IBOutlet Создание для всех TextFields

    class ViewController: UIViewController, UITextFieldDelegate { 
    
        @IBOutlet weak var txtFieldName: UITextField! 
        @IBOutlet weak var txtFieldEmail: UITextField! 
        @IBOutlet weak var txtFieldPassword: UITextField! 
    
        override func viewDidLoad() { 
        super.viewDidLoad() 
    
        } 
    
        //MARK: - Controlling the Keyboard 
        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 
        } 
    } 
    
3

Я полагаю, что вы должны использовать переключатель заявление в textFieldShouldReturn(_:).

// MARK: UITextFieldDelegate 

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    switch textField { 
    case nameTextField: 
     phoneTextField.becomeFirstResponder() 
    case phoneTextField: 
     emailTextField.becomeFirstResponder() 
    case emailTextField: 
     descriptionTextField.becomeFirstResponder() 
    default: 
     textField.resignFirstResponder() 
    } 
    return false 
} 
Смежные вопросы