Выбранный текст не отображается в UITextField - PullRequest
0 голосов
/ 09 мая 2019

Всякий раз, когда я нажимаю UITextField, появляется список контактов, и при нажатии на контакт номер телефона должен отображаться в текстовом поле, по которому щелкнули. В настоящее время у меня есть 3 текстовых поля, и каждый раз, когда я выбираю контакт, он обновляет только первое текстовое поле, даже если, например, я выбрал 2-е текстовое поле. Как мне исправить это так, чтобы номер телефона отображался в соответствующем текстовом поле, которое было выбрано?

Я использую Xcode 10 и думаю, что проблема связана с func setNumberFromContact

    @IBOutlet weak var phonenumber: UITextField!
    @IBOutlet weak var phonenumber1: UITextField!
    @IBOutlet weak var phonenumber2: UITextField!


        func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {


            let phoneNumberCount = contact.phoneNumbers.count

            guard phoneNumberCount > 0 else {
                dismiss(animated: true)
                //show pop up: "Selected contact does not have a number"
                return
            }

            if phoneNumberCount == 1 {
                setNumberFromContact(contactNumber: contact.phoneNumbers[0].value.stringValue)

            }else{

                let alertController = UIAlertController(title: "Select one of the numbers", message: nil, preferredStyle: .alert)

                for i in 0...phoneNumberCount-1 {
                    let phoneAction = UIAlertAction(title: contact.phoneNumbers[i].value.stringValue, style: .default, handler: {
                        alert -> Void in
                        self.setNumberFromContact(contactNumber: contact.phoneNumbers[i].value.stringValue)
                    })
                    alertController.addAction(phoneAction)
                }
                let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: {
                    alert -> Void in

                })
                alertController.addAction(cancelAction)

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

        func setNumberFromContact(contactNumber: String) {

            var contactNumber = contactNumber.replacingOccurrences(of: "-", with: "")
            contactNumber = contactNumber.replacingOccurrences(of: "(", with: "")
            contactNumber = contactNumber.replacingOccurrences(of: ")", with: "")
            guard contactNumber.count >= 10 else {
                dismiss(animated: true) {
                    self.presentAlert(alertTitle: "", alertMessage: "A maximum of 10 contacts allowed per session", lastAction: nil)
                }
                return
            }

            phonenumber.text = String(contactNumber.suffix(10))

        }

        func contactPickerDidCancel(_ picker: CNContactPickerViewController) {

        }




}

extension SelfTestTimer: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }


    func textFieldDidBeginEditing(_ textField: UITextField) {

        if textField.hasText{
            //dont do anything

        }else{

        contactPicker.delegate = self
        self.present(contactPicker, animated: true, completion: nil)
        }
        return
    }

1 Ответ

2 голосов
/ 09 мая 2019

Причина, по которой ваше решение обновляет только одно текстовое поле, заключается в том, что вы обновляете текст только этого текстового поля. В этой строке phonenumber.text = String(contactNumber.suffix(10)) вы изменяете только текст phonenumber. Хорошее решение будет следующим:

Создать временный UITextField для хранения выбранной ссылки на текстовое поле

@IBOutlet weak var phonenumber: UITextField!
@IBOutlet weak var phonenumber1: UITextField!
@IBOutlet weak var phonenumber2: UITextField!
var currentTextField: UITextField?

И использовать это текстовое поле в методах делегатов текстового поля.

extension SelfTestTimer: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        currentTextField = nil
        textField.resignFirstResponder()
        return true
    }
    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField.hasText{
            //dont do anything
        }else{
            currentTextField = textField
            contactPicker.delegate = self
            self.present(contactPicker, animated: true, completion: nil)
        }
        return
    }
}

Назначить выбранный контактный номер в этом текстовом поле

func setNumberFromContact(contactNumber: String) {
    var contactNumber = contactNumber.replacingOccurrences(of: "-", with: "")
    contactNumber = contactNumber.replacingOccurrences(of: "(", with: "")
    contactNumber = contactNumber.replacingOccurrences(of: ")", with: "")
    guard contactNumber.count >= 10 else {
        dismiss(animated: true) {
            self.presentAlert(alertTitle: "", alertMessage: "A maximum of 10 contacts allowed per session", lastAction: nil)
        }
        return
    }
    currentTextField?.text = String(contactNumber.suffix(10))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...