Регистрационная форма с коллекцией торговых точек и тегами

Я новичок в языке Swift. У меня есть знания в веб-разработке, но мне нужна ваша помощь в этом.

Мне нужно создать страницу регистрации с коллекцией выходов. У меня есть 4 текстовых поля, и каждому из них присвоены теги. Поскольку я собираюсь перемещать курсор из одного текстового поля в другое, используя функцию befirstresponder(), он не работает, и когда я печатаю теги, подобные тем, которые я назначил тегу для его текстового поля, он не всегда печатает то же самое.

Он приходит в случайном порядке. Вот код.

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {

@IBOutlet var registerTF: [UITextField]!


@IBAction func registerTFTapped(_ sender: UITextField) {

   let tag = sender.tag
   print(tag)
    for tf in registerTF
    {
     if tf.tag == tag
     {

        func textFieldShouldReturn( _ textField: UITextField) -> Bool {

            nextTextFieldToFirstResponder(textField: textField)

            return true;
        }

        func nextTextFieldToFirstResponder(textField: UITextField) {

            if tf.tag == 0 {

                self.becomeFirstResponder()

            }
            else if tf.tag == 1 {

                self.becomeFirstResponder()

            }
            else if tf.tag == 2 {

                self.becomeFirstResponder()

            }
            else if tf.tag == 3 {

                self.resignFirstResponder()

            }

        }

        }
    }
}

//LifeCycle-Starts

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func viewWillAppear(_ animated: Bool) {
    //#
}

override func viewDidAppear(_ animated: Bool) {
    //#
}

override func viewWillDisappear(_ animated: Bool) {
    //#
}

override func viewDidDisappear(_ animated: Bool) {
    //#
}

//LifeCycle-Ends

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

person Rob    schedule 19.12.2017    source источник
comment
Я думаю, вам нужно сделать первого ответчика следующим текстовым полем в массиве вместо вашего viewController, который является самостоятельным   -  person Reinier Melian    schedule 19.12.2017
comment
Обычно вы не используете теги. Обычно вы должны создавать отдельные торговые точки для каждого поля. Вы не хотите self.becomeFirstResponder; вам нужно следующее текстовое поле, чтобы стать первым ответившим.   -  person Paulw11    schedule 19.12.2017
comment
Я уже создал отдельные розетки, и таким образом это сработало, но я хочу работать с коллекцией розеток. Как я могу получить следующее текстовое поле с помощью тегов?   -  person Rob    schedule 19.12.2017


Ответы (1)


Это будет работать только в том случае, если порядок в коллекции TextFields равен порядку тегов.

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {

    @IBOutlet var registerTF: [UITextField]!

    func nextTag(currentTag:Int)->Int{

        if(currentTag < registerTF!.count - 1){
            return currentTag + 1
        }
        return -1
    }

    func nextTextFieldToFirstResponder(textField: UITextField) {

        let nextTag = self.nextTag(currentTag: textField.tag)

        if(nextTag >= 0){
            self.registerTF![nextTag].becomeFirstResponder()
        }else{
            textField.resignFirstResponder()
        }
    }

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

    //LifeCycle-Starts

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        for textField in registerTF {
            textField.delegate = self
        }
    }

    override func viewWillAppear(_ animated: Bool) {
        //#
    }

    override func viewDidAppear(_ animated: Bool) {
        //#
    }

    override func viewWillDisappear(_ animated: Bool) {
        //#
    }

    override func viewDidDisappear(_ animated: Bool) {
        //#
    }

    //LifeCycle-Ends

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
person Reinier Melian    schedule 19.12.2017
comment
Эй, спасибо за помощь, но это дает это значение типа «ViewController», не имеет члена «nextTag» - person Rob; 19.12.2017
comment
Вам нужно добавить метод @Rob - person Reinier Melian; 19.12.2017
comment
Извините, я очень новичок. Я не получил часть метода. Не могли бы вы объяснить? - person Rob; 19.12.2017
comment
Я опубликую полный пример этого, но прежде всего мне нужно иметь хорошее представление о том, что вы хотите, вам нужно перейти от одного текстового поля к другому, когда нажата кнопка «Готово», это то, что вам нужно? - person Reinier Melian; 19.12.2017
comment
Да, у меня есть 4 текстовых поля. Они подключены к контроллеру представления как коллекция выходов, и вы можете увидеть код, в котором это действие также присутствует. Что мне нужно, так это то, что когда я нажимаю «Далее» на клавиатуре после заполнения tf 1, он должен перейти к tf2, и то же самое должно происходить до tf4, а когда на tf4 я нажимаю «Готово», клавиатура должна скрываться. - person Rob; 19.12.2017
comment
Дай мне знать @Роб - person Reinier Melian; 19.12.2017
comment
Спасибо. Был ли какой-либо другой способ использовать теги, как в html, мы получаем имя в форме, чтобы получить это конкретное входное значение, поскольку здесь теги были случайным образом плавающие. - person Rob; 19.12.2017
comment
@Rob [self.view viewWithTag:myTag] вы можете получить элемент пользовательского интерфейса по его тегу, проверьте этот ответ stackoverflow.com/questions/4794005/ - person Reinier Melian; 19.12.2017
comment
Спасибо большое за вашу помощь. - person Rob; 19.12.2017
comment
Привет @Reinier Melian, здесь текущий тег является параметром, верно? Я хочу знать, как вы получаете значение текущего тега? - person Rob; 20.12.2017
comment
вам нужно отредактировать свойство тега в ваших текстовых полях, от 0 до count -1 каждое текстовое поле должно иметь тег, я могу предоставить дополнительную информацию, дайте мне знать, если вам это нужно @Rob - person Reinier Melian; 20.12.2017
comment
На самом деле, сэр, я добавил теги к каждому текстовому полю. - person Rob; 24.12.2017