Невозможно установить текст для поля UIText из другого класса - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь установить текст для UITextField в SecondViewController из FirstViewController, используя следующий код:

// First ViewController
@IBAction func buttonAction(_ sender: Any) {
    let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController
    viewController?.sampleTxtField?.text = "world"
    if let navigator = self.navigationController {
        navigator.pushViewController(viewController!, animated: true)
    }
}


// Second ViewController
 @IBOutlet weak var sampleTxtField: UITextField?
override func viewDidLoad() {
    super.viewDidLoad()
    print("the textfield value is,\(String(describing: sampleTxtField?.text))")
}

В журнале я получаю: "the textfield value is,Optional("")"

Я думаю, что делаю какую-то глупую ошибку. Я проверил много вопросов, но не могу найти решение.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Создайте переменную во втором viewController следующим образом:

var sampleText: String!

А в viewDidLoad() контроллера второго вида напишите:

sampleTxtField?.text = sampleText

и в первом представлении контроллер замените строку viewController?.sampleTxtField?.text = "world" на эту:

viewController.sampleText = "world"

Это стандартный способ установки значения для textField из другого класса.

0 голосов
/ 30 апреля 2018

Когда вы создаете экземпляр UIViewController из раскадровки с использованием метода instantiateViewController(withIdentifier:), он создает новый экземпляр ViewController и возвращает его, но UIView и его элементы не инициализируются, пока UIView не будет загружен в память.

ViewDidLoad () вызывается, когда представление содержимого контроллера представления ( вершина его иерархии представления) создается и загружается из раскадровки. Выходные данные контроллера представления гарантированно будут иметь действительные значения время вызова этого метода.

Таким образом, вам необходимо настроить значения элементов пользовательского интерфейса в ViewDidLoad, чтобы иметь правильное значение для этих элементов.

В вашем случае строка viewController?.sampleTxtField?.text = "world" не будет работать, поскольку представления еще не загружены в память. Чтобы решить эту проблему, вам нужно определить строковую переменную и присвоить значение после инициализации ViewController. Затем в ViewDidLoad вы можете присвоить значение String текстовому свойству UITextField.

class SecondViewController: UIViewController {

   @IBOutlet weak var sampleTxtField: UITextField!
   var sampleText: String? //it can be var also with default value

   func viewDidLoad() {
     super.viewDidLoad()
     //assign the textField Value here
     if let text = sampleText {
        self.sampleTxtField.text = text 
     }
   }
}

Теперь в FirstViewController вы можете назначить свойство sampleText, например

@IBAction func buttonAction(_ sender: Any) {
    guard let secondViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController else {
      fatalError("No ViewController with Identifier "SecondViewController")
    }
    secondViewController.sampleText = "world"
    if let navigator = self.navigationController {
        navigator.pushViewController(secondViewController, animated: true)
    }
}
0 голосов
/ 30 апреля 2018

Ваш код неверный.

let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController
    viewController?.sampleTxtField?.text = "world"

В приведенном выше описании представление не загружается в пользовательском интерфейсе, поэтому sampleTxtField всегда будет иметь значение nil. Вместо этого создайте свойство в SecondVC, var sample : String? и назначьте его, как указано выше. Затем в viewVidload SecondVC присвойте значение как textField.text = sample

// First ViewController

@IBAction func buttonAction(_ sender: Any) {
    let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController
    viewController?.sample = "world"
    if let navigator = self.navigationController {
        navigator.pushViewController(viewController!, animated: true)
    }
}

// Второй ViewController

@IBOutlet weak var sampleTxtField: UITextField?
var sample : String?
override func viewDidLoad() {
    super.viewDidLoad()
sampleTxtField.text =  sample
    print("the textfield value is,\(String(describing: sampleTxtField?.text))")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...