Как вернуть значения функции после нажатия на кнопку в alertcontroller swift?

Пользователь

от jorge , в категории: Swift , год назад

Как вернуть значения функции после нажатия на кнопку в alertcontroller swift?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от kaleigh , год назад

@jorge 

Вы не можете вернуть значения функции после нажатия на кнопку в AlertController в Swift, так как AlertController работает асинхронно. Вместо этого, вам нужно определить обработчик действия для кнопки в AlertController и выполнить желаемое действие внутри обработчика.


Например, если вы хотите определить AlertController для ввода текста и получить результаты при нажатии на кнопку, вы можете сделать следующее:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func showAlert() {
    let alertController = UIAlertController(title: "Введите текст", message: "", preferredStyle: .alert)
    
    alertController.addTextField { (textField : UITextField!) -> Void in
        textField.placeholder = "Текст"
    }

    let saveAction = UIAlertAction(title: "Сохранить", style: .default, handler: { alert -> Void in
        let textField = alertController.textFields![0] as UITextField
        let text = textField.text
        // Вызовите вашу функцию с полученным текстом
        self.myFunction(text)
    })

    let cancelAction = UIAlertAction(title: "Отменить", style: .default, handler: {
        (action : UIAlertAction!) -> Void in
    })

    alertController.addAction(saveAction)
    alertController.addAction(cancelAction)

    present(alertController, animated: true, completion: nil)
}

func myFunction(_ text: String?) {
    // Выполните ваше действие с полученным текстом
}


В этом примере, функция showAlert() определяет AlertController с текстовым полем для ввода и двумя кнопками - "Сохранить" и "Отменить". Обработчик для кнопки "Сохранить" вызывает функцию myFunction() с полученным текстом. Затем вы можете выполнить желаемое действие внутри функции myFunction().

Пользователь

от mona_terry , 6 месяцев назад

@jorge 

Как альтернативу, вы также можете использовать замыкания (closures) для передачи значения обратно из AlertController. Вот пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
func showAlert(completion: @escaping (String?) -> Void) {
    let alertController = UIAlertController(title: "Введите текст", message: "", preferredStyle: .alert)
    
    alertController.addTextField { (textField : UITextField!) -> Void in
        textField.placeholder = "Текст"
    }

    let saveAction = UIAlertAction(title: "Сохранить", style: .default, handler: { alert -> Void in
        let textField = alertController.textFields![0] as UITextField
        let text = textField.text
        
        completion(text)
    })

    let cancelAction = UIAlertAction(title: "Отменить", style: .default, handler: {
        (action : UIAlertAction!) -> Void in
        completion(nil)
    })

    alertController.addAction(saveAction)
    alertController.addAction(cancelAction)

    present(alertController, animated: true, completion: nil)
}

// Вызов функции showAlert и получение результата
showAlert { (text) in
    if let text = text {
        // Выполните ваше действие с полученным текстом
        print("Введенный текст: (text)")
    } else {
        print("Пользователь отменил ввод")
    }
}


В этом примере, функция showAlert() принимает замыкание (closure) как параметр, которое передается назад с результатом введенного текста или nil в случае отмены. При вызове showAlert(), вы можете указать действие, которое нужно выполнить с полученным текстом в замыкании.