【发布时间】:2018-09-16 17:58:50
【问题描述】:
docs 说子类化 UIAlertController 不好
UIAlertController 类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。
那么,推荐的警报方式是什么?不仅显示标题、消息和一些按钮,还显示进度条、列表等其他内容?
在我的特殊情况下,我希望有两种不同的警报,一种显示 ProgressBar,另一种显示错误消息列表。
目前我正在尝试手动添加 ProgressView 并设置约束:
func getProgressAlert(onAbort: @escaping () -> ()) -> UIAlertController {
let alert = UIAlertController(title: "Test", message: "Test", preferredStyle: .alert)
let abort = UIAlertAction (title: "Abort", style: UIAlertActionStyle.cancel) { _ in
onAbort()
}
alert.addAction(abort)
let margin:CGFloat = 8.0
let rect = CGRect(x:margin, y:72.0, width: alert.view.frame.width - margin * 2.0 , height:2.0)
self.progressView = UIProgressView(frame: rect)
self.progressView!.setProgress(0.0, animated: false)
self.progressView!.tintColor = UIColor.blue
alert.view.addSubview(self.progressView!)
self.progressView!.translatesAutoresizingMaskIntoConstraints = false
self.progressView!.widthAnchor.constraint(equalTo: alert.view.widthAnchor, multiplier: 1.0).isActive = true
self.progressView!.heightAnchor.constraint(equalToConstant: 5.0).isActive = true
self.progressView!.topAnchor.constraint(equalTo: alert.view.topAnchor).isActive = true
self.progressView!.leftAnchor.constraint(equalTo: alert.view.leftAnchor).isActive = true
return alert
}
我不认为这是应该这样做的方式,因为手动定义约束很容易在不同的设备上出错。例如,当前代码只是在警报视图顶部显示进度条,但我希望它显示在消息和中止按钮之间。
【问题讨论】:
-
推荐的方法是编写自己的自定义警报视图,而不是使用
UIAlertController。 -
是的,正如 rmaddy 所说,您只需要提供一个自定义视图控制器。查看 UIViewController.modelPresentationStyle 属性,它将帮助您覆盖自定义视图控制器,但您喜欢它。 ModalPresentationStyle
-
好吧,如果我理解正确的话,UIAlertController 只是 UIViewController 的一个特殊实现,它有一些默认元素,对吧?现在我应该定义我自己的继承自 UIViewController 的类,然后以模态方式呈现它,而不是使用 UIAlertController 并对其进行修改。
-
是的。查看此page 的“另请参阅”部分,以了解有关在呈现/关闭自定义视图控制器时可以做什么的更多信息。
标签: ios swift uialertcontroller uiprogressview