如何设置 UIAlert 显示大量信息?

How to set up UIAlert to display a lot of information?

我想为用户设置 UI 警报作为 "check"。用户将要保存一组信息,但我想让用户有机会在点击 "save" 按钮后查看这些信息。本质上,他们点击 "save",然后我希望出现一个 UI 警报,显示他们正在询问 "Are you sure all of this information is correct:" 保存的信息,然后显示所有信息:

@IBAction func saveButtonTapped(_ sender: UIBarButtonItem) {
        //create alert (I know how to do this) that shows all info (I don't know how to do this)
        //If user is ok with the info, perform a segue, if not return to page
}

问题是我知道 UIAlerts 可以包含 "title" 和 "message" 等组件,但我希望警报能够在列表中显示大量信息,例如时尚。有没有办法做到这一点?还是我不需要使用警报,而是将其带到不同的确认页面或不同的 UI 元素?

要在视图控制器上显示警报,可以使用以下代码。

let a = UIAlertController(title: "Your title", message: "Your message", preferredStyle: .alert)
a.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
    // Pressed "OK"
}))
self.present(a, animated: true, completion: { finished in
    // Alert shown
})

但是,警报中可以容纳多少信息是有限制的。如果您有更长的时间,创建一个新的视图控制器并以模态方式呈现它也可以。这可以让您自定义信息的呈现方式(例如,使用滚动/页面视图)。您还可以自定义您的视图控制器,使其看起来像一个警报,这样它的目的就更清楚了。要以模态方式呈现视图控制器,您可以使用 present 方法。

self.present(otherViewController, animated: true, completion: nil)

我在制作类似警报的模态视图控制器的路径中使用的一种方法是在当前视图控制器上呈现一个较小的视图控制器,并更改它的模态呈现样式,以便您可以通过它看到基本视图控制器.

let otherVC = self.storyboard?.instantiateViewController(withIdentifier: "OtherViewController") as! OtherViewController
otherVC.modalPresentationStyle = .overCurrentContext
otherVC.view.center = vc.view.center
otherVC.delegate = self //Create a delegate so that you can control actions such as "OK" buttons
self.view.isUserInteractionEnabled = false //Stop the user interacting with the view controller behind the alert
self.present(otherVC, animated: true, completion: nil)

编辑: 您可以使委托控制操作,例如使用操作关闭警报。例如,这可能是您的代表的示例:

protocol AlertDelegate {
    func didCancel()
    func didOkay()
} 

然后,你可以这样实现:

class RootViewController: UIViewController, AlertDelegate {
    func didCancel() { ... }
    func didOkay() { ... }

    func showAlert() {
        ...
        otherVC.delegate = self
        ...
    }
}

然后在您的警报视图控制器中,您可以与委托进行交互。

class MyAlert: UIViewController {
    var delegate: AlertDelegate!

    @IBAction func cancelButton(sender: UIButton) {
        delegate.didCancel()
        self.dismiss(animated: true, completion: nil)
    }
}

因此,当单击警报视图控制器上的取消按钮时,代理会说它已取消,模态视图控制器将被关闭。然后,根视图控制器将收到此操作,并可以相应地处理它。

可以使用UIAlertViewController显示很多行,它会自动处理滚动。但问题是,够用够漂亮吗?

看看这个简单的例子:

    @IBAction func showAlert(_ sender: UIButton) {        
        var lines = [String]()
        for i in 1...100 {
            lines.append("this is line \(i)")
        }

        let alertController = UIAlertController(title: "title", message: lines.joined(separator: "\n"), preferredStyle: .alert)

        alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))

        present(alertController, animated: true, completion: nil)
    }

这给了我这个观点:

内容可滚动。

几个问题和注意事项:

  1. 好像有上限。例如,如果我将其更改为 for i in 1...500,我将看不到任何内容
  2. 我认为这不是真正的用户友好

所以...我认为您应该考虑 UIAlertViewController 之外的其他解决方案 :)

希望对你有所帮助。