Все диалоговое сообщение с предупреждением и 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)
5 ответов
У меня была такая же проблема, и я решил ее через 3 дня и ночи. Поскольку UIAlertViewController использует UILabel для отображения сообщения, я твердо искал во всем проекте что-то, что модифицирует UILabel. Я понял, что в результаты поиска не входит ничего из некоторых модулей, в которых определенно есть ключевые слова "label" в именах их функций и тому подобное. Я решил скачать исходные коды для всех модулей из их репозиториев и рекурсивно искать внутри них с помощью другого простого текстового редактора и вуаля! Какой-то парень решил переопределить класс UILabel по умолчанию вместо того, чтобы создавать его в своем модуле. Линии виновника были
extension UILabel {
...
override open func draw(_ rect: CGRect) { ... }
override open var intrinsicContentSize: CGSize { ... }
...
}
Они не отображаются в результатах поиска с помощью функции поиска в XCode, так как я искал расширения UILabel для начала. Итак, я рекомендую вам открыть исходные коды любой сторонней фреймворк в вашем проекте и искать внутри них отдельно. С классом UILabel определенно что-то мешает.
Решено наконец
Я решил эту проблему, сделав пользовательский 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)