Как обнаружить сфокусированный UITextField в представлении контейнера из контроллера родительского представления - PullRequest
0 голосов
/ 27 марта 2019

У меня есть контейнер с несколькими текстовыми полями.У меня также есть кнопка в контроллере Parent View (пользовательская клавиатура).То, что я пытаюсь сделать, это сначала выбрать текстовое поле, и когда я нажимаю на кнопку, я хотел, чтобы какое-то значение было заполнено в этом последнем выбранном / выделенном текстовом поле.Как я могу это сделать?Любые альтернативные способы тоже приветствуются.(У меня есть несколько представлений контейнера в исходном коде и я пытаюсь использовать одну клавиатуру для всех представлений)

storyboard

class MainViewController: UIViewController {
    var weightVC : WeightViewController!
    var focusedElement : UITextField

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if (segue.identifier == "weight") {
            weightVC = segue.destination as? WeightViewController
        }
    }

    @IBAction func button1Clicked(_ sender: Any) {

        if weightVC != nil {
            weightVC.sampleTextBox1.text = "1"
            //I want this sampleTextBox1 to be dynamic like weightVC.focusedInput = "1"
        }

    }
}

extension MainViewController:ChildToParentProtocol {
   func setFocusedElement(with value: UITextField){
      focusedElement = value
   }
}

Контроллер просмотра контейнера


protocol ChildToParentProtocol: class {
    func setFocusedElement(with value:UITextField)
}

class WeightViewController: UIViewController {

    weak var delegate:  ChildToParentProtocol? = nil

    @IBOutlet weak var sampleTextBox1: UITextField!
    @IBOutlet weak var sampleTextBox2: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    // sampleTextBox1 Editing Did Begin event
    @IBAction func editBeginSampleText1(_ sender: Any) {
        print("edit begin")
        delegate?.setFocusedElement(with: sampleTextBox1)
    }

}

Другими словами, я просто хочу сохранить ссылку на последний фокусированный UITextFild при нажатии кнопки.Надеюсь, мое требование достаточно ясно.Пожалуйста, ведите меня, если есть способ достичь этого.

Спасибо

1 Ответ

1 голос
/ 27 марта 2019

Если я правильно понял ваш вопрос, вы можете отследить, по какой ссылке UITextField, используя ее тег.И вы можете использовать UITextFieldDelegate, чтобы получить выбранный тег UITextField.

Рассмотрите приведенный ниже код для WeightViewController

protocol ChildToParentProtocol: class {
    //Changed value to Int for passing the tag.
    func setFocusedElement(with value: Int)
}

import UIKit

class WeightViewController: UIViewController {

    @IBOutlet weak var tf1: UITextField!
    @IBOutlet weak var tf2: UITextField!

    var selectedTFTag = 0
    weak var delegate: ChildToParentProtocol? = nil

    override func viewDidLoad() {
        super.viewDidLoad()

        //Assign delegate and tags to your TF
        tf1.delegate = self
        tf2.delegate = self

        tf1.tag = 1
        tf2.tag = 2
    }
}

extension WeightViewController: UITextFieldDelegate {
    func textFieldDidBeginEditing(_ textField: UITextField) {
        //Get the selected TF tag
        selectedTFTag = textField.tag
        //Pass tag to parent view
        delegate?.setFocusedElement(with: selectedTFTag)
    }
}

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

import UIKit

//You need to confirm your ChildToParentProtocol with your UIViewController
class ViewController: UIViewController, ChildToParentProtocol {

    var selectedTFTag = 0
    var weightVC : WeightViewController!

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

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "weight" {
            weightVC = segue.destination as? WeightViewController
            //You need to pass delegate to containerview to make it working.
            weightVC.delegate = self
        }
    }

    @IBAction func btn1Tapped(_ sender: Any) {

        //According to selected Tag perform your action
        if selectedTFTag > 0 {
            switch selectedTFTag {
            case 1:
                //set up first UITextField
                weightVC.tf1.text = "First textfield was selected"
                print("1")
            case 2:
                //set up second UITextField
                weightVC.tf2.text = "Second textfield was selected"
            default:
                break
            }
        }
    }

    @IBAction func btn2Tapped(_ sender: Any) {

        //According to selected Tag perform your action
        if selectedTFTag > 0 {
            switch selectedTFTag {
            case 1:
                //set up first UITextField
                weightVC.tf1.text = "First textfield was selected"
                print("1")
            case 2:
                //set up second UITextField
                weightVC.tf2.text = "Second textfield was selected"
            default:
                break
            }
        }
    }

    func setFocusedElement(with value: Int) {
        //Get selected TF tag with delegate
        selectedTFTag = value
    }
}

Вы можете проверить ЭТОТ демонстрационный проект для получения дополнительной информации.

...