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

时间:2017-05-16 19:35:02

标签: swift uialertcontroller uialertaction

我想将UIAlert设置为用户的“检查”。用户将保存一组信息,但我想让用户有机会在点击“保存”按钮后查看信息。基本上,他们点击“保存”,然后我想要一个UIAlert显示他们正在保存的信息,询问“你确定所有这些信息都是正确的:”然后显示所有信息:

constructor(private renderer: Renderer2) {}
...
this.listenFunc = renderer.listen(document.body, 'click', (e) => {
   ...
});
...
ngOnDestroy() {
  this.listenFunc();
}

问题在于我知道@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 } 可以包含“title”和“message”等组件,但我希望警报能够像时尚一样在列表中显示大量信息。反正有没有这样做?或者我是否需要不使用警报,而是将其带到不同的确认页面或者可能是不同的UI元素?

2 个答案:

答案 0 :(得分:2)

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

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)
    }
}

因此,当在警报视图控制器上单击取消按钮时,代理会将其取消,并且模态视图控制器将被解除。然后,根视图控制器将接收此操作,并可以相应地处理它。

答案 1 :(得分:1)

可以使用tbody { overflow-y: scroll; (could be: 'overflow: scroll' for the two axes) display: block; with: xxx (a number or 100%) } thead { display: inline-block; } 来呈现很多行,它会自动处理滚动。但问题是,如果可以使用且足够好吗?

看看这个简单的例子:

UIAlertViewController

这给了我这个观点:

alert view with many lines

可滚动内容。

一些问题和注意事项:

  1. 似乎有一个上限。如果我将其更改为 @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) } ,例如我看不到任何内容
  2. 我认为这不是用户友好的
  3. 所以......我认为你应该考虑另一种解决方案而不是for i in 1...500:)

    希望对你有所帮助。