Все диалоговое сообщение с предупреждением и textField были изменены на одну строку. Пожалуйста, проверьте изображение

Ранее все диалоги и textField работали хорошо. Но не я не знаю, как эти TextFields внезапно меняются на одну строку с тройным. (Как и некоторые сообщения здесь...)

    let alert = UIAlertController(title: "Cancel Booking !!", message: "Are you sure you want to cancel your booking?", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "No", style: .default, handler: nil))
    alert.addAction(UIAlertAction(title: "Yes", style: .default, handler: self.cancelMessageDialog))
    self.present(alert, animated: true, completion: nil)

Демо 1 Демо 3

5 ответов

У меня была такая же проблема, и я решил ее через 3 дня и ночи. Поскольку UIAlertViewController использует UILabel для отображения сообщения, я твердо искал во всем проекте что-то, что модифицирует UILabel. Я понял, что в результаты поиска не входит ничего из некоторых модулей, в которых определенно есть ключевые слова "label" в именах их функций и тому подобное. Я решил скачать исходные коды для всех модулей из их репозиториев и рекурсивно искать внутри них с помощью другого простого текстового редактора и вуаля! Какой-то парень решил переопределить класс UILabel по умолчанию вместо того, чтобы создавать его в своем модуле. Линии виновника были

extension UILabel { ... override open func draw(_ rect: CGRect) { ... } override open var intrinsicContentSize: CGSize { ... } ... }

Они не отображаются в результатах поиска с помощью функции поиска в XCode, так как я искал расширения UILabel для начала. Итак, я рекомендую вам открыть исходные коды любой сторонней фреймворк в вашем проекте и искать внутри них отдельно. С классом UILabel определенно что-то мешает.

Добавьте символы разрыва строки (\n) к вашему сообщению.

Решено наконец

Я решил эту проблему, сделав пользовательский UILable внутри UIViewController. Это может не быть хорошей практикой, поэтому, пожалуйста, дайте мне знать, если кто-то найдет лучшее решение, чем это.

func showTestAlert(message:String , viewController:UIViewController){

    let customUiLableView:UILabel
    let alert:UIAlertController

    if((message.count) < 100){
        alert = UIAlertController(title: "", message: "\n\n\n\n", preferredStyle: .alert)
        customUiLableView = UILabel(frame: CGRect(x: 10, y: 0, width: 250, height: 120))
        customUiLableView.numberOfLines = 4
    }else if((message.count) < 200){
        alert = UIAlertController(title: "", message: "\n\n\n\n\n\n", preferredStyle: .alert)
        customUiLableView = UILabel(frame: CGRect(x: 10, y: 0, width: 250, height: 160))
        customUiLableView.numberOfLines = 6
    }else{
        alert = UIAlertController(title: "", message: "\n\n\n\n\n\n\n\n", preferredStyle: .alert)
        customUiLableView = UILabel(frame: CGRect(x: 10, y: 0, width: 250, height: 200))
        customUiLableView.numberOfLines = 8
    }
    customUiLableView.text = message
    customUiLableView.textAlignment = .center
    customUiLableView.textColor = UIColor.darkGray
    customUiLableView.font = UIFont(name: "Helvetica", size: 16.0)

    let action = UIAlertAction(title: "OK", style: .default, handler: nil)
    alert.view.addSubview(customUiLableView)
    alert.addAction(action)

    viewController.present(alert, animated: true, completion: nil)

}

Вы должны установить numberOfLines собственностью UILabelпоскольку значение по умолчанию равно 1 (одна строка) & а значение 0 означает отсутствие ограничений, если высота текста достигает количества строк NumberOfLines или высота представления меньше допустимого количества строк LineOf, текст будет обрезан используя режим разрыва строки.

if #available(iOS 9.0, *) {
        UILabel.appearance(whenContainedInInstancesOf: [UIAlertController.self]).numberOfLines = 0
    } else {
        // Fallback on earlier versions
    }

Вы должны использовать attributedMessage Строка с setValue метод UIAlertController здесь просто так:

    let attributedString = NSAttributedString(string: "My long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long text",
                                              attributes: [NSAttributedStringKey.font : UIFont(name: "Avenir-Light", size: 20)!])

    let alert = UIAlertController(title: "Title", message: "", preferredStyle: .alert)

    alert.setValue(attributedString, forKey: "attributedMessage")

    let yesAction = UIAlertAction(title: "Yes", style: .default) { (action) in
    }
    let noAction = UIAlertAction(title: "No", style: .cancel) { (action) in
    }

    alert.addAction(noAction)
    alert.addAction(yesAction)

    present(alert, animated: true, completion: nil)
Другие вопросы по тегам