У меня есть два контроллера представления, я хочу отправить значение текстового поля второго контроллера представления в первый массив контроллеров представления и отклонить второй контроллер представления при нажатии кнопки.
вот мой код:
в первом ВК:
я создал массив:
var iteamsArr = [String]()
во втором ВК:
class CreatePopUpViewController: UIViewController {
var popData: String?
var createBussnss = CreateBusinessViewController()// is my firstVC name
@IBOutlet weak var addTf: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func saveButn(_ sender: Any) {
createBussnss.iteamArray.append(addTf.text!)
dismiss(animated: true, completion: nil)
}
}
здесь контроллер просмотра отклоняется, но значения не добавляются в первый контроллер просмотра пожалуйста, помогите мне
Используйте делегат.
protocol CreatePopUpDelegate: class {
func createPopUpDidSaveTextFieldPick(_ value: String)
}
Затем в контроллере первого вида:
extension FirstViewController: CreatePopUpDelegate {
func createPopUpDidSaveTextFieldPick(_ value: String) {
print ("first view controller now has value of textfield")
// add it to array or whatever
}
Затем во втором контроллере представления:
class CreatePopUpViewController: UIViewController, MyDelegate {
weak var delegate: CreatePopUpDelegate?
@IBAction func saveButn(_ sender: Any) {
createBussnss.iteamArray.append(addTf.text!)
delegate?.createPopUpDidSaveTextFieldPick(addTf.text!)
dismiss(animated: true, completion: nil)
}
где-то в коде вам просто нужно сделать:
secondViewController.delegate = firstViewController.
В сценариях такого типа экземпляр secondViewController
создается и представляется из firstViewController
, поэтому вы просто делаете:
secondViewController.delegate = self
Кроме того, в качестве общего совета подготовьте Руководство по коду для Swift. В Swift предпочтительны более длинные и понятные имена.
Вместо saveButn
делайте saveButton
.
Вместо addTf
делайте addTextField
.
Вместо createBussnss
делайте createBussiness
Также не делайте !
, лучше делайте guard let text = textField.text else { return
.
Удачи! Это более понятный и лучший код.
CreatePopUpDelegate
можно создать где угодно. Выше определения любого из ваших классов или где угодно.
Вы можете использовать делегат для связи между двумя контроллерами, а теперь в Swift мы можем даже использовать замыкания для того же. Вам нужно объявить обработчик во втором ViewController, например:
var saveButtonHandler = ((_ handler: String?) -> Void)
В FirstViewController, где вы будете нажимать на контроллер, вы можете определить этот обработчик, например
secondViewController.saveButtonHandler = { (text:String) in
//append your text here to array
}
и при нажатии кнопки сохранения
self.saveButtonHandler?(<Your_Text>)
Просто убедитесь, что вы используете только String
внутри обработчика, не используйте кнопку или какие-либо переменные secondViewController
. Вы можете попасть в цикл удержания.
Большое спасибо, это действительно полезно, я проголосовал и принял ваш ответ, но я очень плохо знаком с быстрым, у меня есть одно сомнение ... где я должен создать CreatePopUpDelegate