Swift:自定义UIAlertController视图

Sim*_*n H 1 uiprogressview ios swift uialertcontroller

文件说,继承UIAlertController是坏

UIAlertController类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不能修改。

那么,推荐一种不仅显示标题,消息和某些按钮,还显示其他东西(例如ProgressBars,List等)的警报的方法是什么?

在我的特殊情况下,我希望有两种不同的警报,一种显示进度条,另一种显示错误消息列表。

目前,我正在尝试手动添加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
}
Run Code Online (Sandbox Code Playgroud)

我不认为这是应该这样做的方式,因为手动定义约束很容易在不同设备上出错。例如,当前代码仅在警报视图的顶部显示进度条,但我希望将其显示在消息和中止按钮之间。

Oli*_*son 7

此类的视图层次结构是私有的,不能修改。

这几乎是该API棺材中的钉子。如果您尝试对其进行破解,则尝试在不同的iOS版本上支持它会给您带来很多痛苦。

如果要在警报中具有自定义控件,则必须编写自定义UIViewController子类并在添加新功能的同时尽可能地模仿API(如果您不想这样做,则GitHub上将提供示例)。

一些例子: