В Swift Команды при закрытии оповещения выполнялись до того, как выполнится оповещение интерфейса? - PullRequest
1 голос
/ 20 апреля 2020

На основании следующего кода команды закрытия в функции оповещения выполняются перед выполнением интерфейса пользователя. Это вызывает, переменные в закрытии быть пустыми?

func callAlert2() {
    let alert = UIAlertController(title: "Add Contact", message: "Please fill the form", preferredStyle: .alert)


    alert.addTextField { textField in
        textField.placeholder = "Name"
        self.contact.name = textField.text
    }

    alert.addTextField { (textField) in
        textField.placeholder = "Surname"
        self.contact.surname = textField.text
    }

    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
    alert.addAction(UIAlertAction(title: "Add", style: .default, handler: { (action) in
        if let name = alert.textFields?.first?.text {        
            self.allContacts.append(self.contact)
        }
    }))


    self.present(alert, animated: true, completion: nil)
}

1 Ответ

0 голосов
/ 20 апреля 2020

Похоже, вы не поняли addTextField(configurationHandler:) согласно документам

Блок для настройки текстового поля перед отображением предупреждения. Этот блок не имеет возвращаемого значения и принимает один параметр, соответствующий объекту текстового поля. Используйте этот параметр для изменения свойств текстового поля.

Ссылка: https://developer.apple.com/documentation/uikit/uialertcontroller/1620093-addtextfield

Вы ожидаете, что у self.contact объекта name и surname обновляется внутри блока конфигурации, но этого никогда не произойдет. Это закрытие / блок предназначен только для настройки текстового поля, а не для захвата ввода пользователя.

Внутри этого замыкания вы можете изменить свойство textFields, например заполнитель, цвет фона, рамку и т. Д. 1024 * и c, чтобы настроить его перед отображением. Но если вы хотите захватить пользовательский ввод, используйте закрытие действий.

Скорее

alert.addAction(UIAlertAction(title: "Add", style: .default, handler: { (action) in
            if let name = alert.textFields?.first?.text,
                (alert.textFields?.count ?? 0) >= 1,
                let surname = alert.textFields?[1].text {
                self.contact.name = name
                self.contact.surname = surname
                self.allContacts.append(self.contact)
            }
        }))

Надеюсь, это поможет

...