如何在警报控制器中滚动操作?Xcode 8,Swift 3,iOS



请帮助!:)我在这里是一个巨大的菜鸟。我已经从各种来源收集了此代码,所以我真的不知道自己在做什么。我的警报控制器显示了我可以写入的文本字段,"取消"操作,"确定"操作,并且还显示了标签"标签"操作的多个输入关键字。

它具有太多的操作(我需要的20个关键字动作),以至于它不适合屏幕,它被键盘覆盖,或者在键盘上。它看起来很丑,您无法触摸的一些按钮。有没有办法滚动我的动作以使其适合此空间?

这是我最后一个图像的代码:

//Quality Text Box (9)
@IBOutlet weak var QualityLabel: UILabel!
@IBAction func QualityTapped(_ sender: UIButton) {
    print("Quality Button Tapped")
    openQualityAlert()
}
func openQualityAlert() {
//Create Alert Controller
    let alert9 = UIAlertController (title: "Quality:", message: nil, preferredStyle: UIAlertControllerStyle.alert)
//Create "Keyword -> label" actions
    let bt1 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Abuse"}
    alert9.addAction(bt1)
    let bt2 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Hemmorhage"}
    alert9.addAction(bt2)

    let bt3 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Discomfort"}
    alert9.addAction(bt3)
    let bt4 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Acute"}
    alert9.addAction(bt4)
    let bt5 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Disease"}
    alert9.addAction(bt5)
    let bt6 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Rash"}
    alert9.addAction(bt6)

    let bt7 = UIAlertAction(title: "Itch", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Itch"}
    alert9.addAction(bt7)
    let bt8 = UIAlertAction(title: "Burn", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Burn"}
    alert9.addAction(bt8)

    let bt9 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Abuse"}
    alert9.addAction(bt9)
    let bt10 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Hemmorhage"}
    alert9.addAction(bt10)

    let bt11 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Discomfort"}
    alert9.addAction(bt11)
    let bt12 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Acute"}
    alert9.addAction(bt12)
    let bt13 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Disease"}
    alert9.addAction(bt13)
    let bt14 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Rash"}
    alert9.addAction(bt14)

    let bt15 = UIAlertAction(title: "Itch", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Itch"}
    alert9.addAction(bt15)
    let bt16 = UIAlertAction(title: "Burn", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Burn"}
    alert9.addAction(bt16)
    let bt17 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Abuse"}
    alert9.addAction(bt17)
    let bt18 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Hemmorhage"}
    alert9.addAction(bt18)

    let bt19 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Discomfort"}
    alert9.addAction(bt19)
    let bt20 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Acute"}
    alert9.addAction(bt20)
    let bt21 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Disease"}
    alert9.addAction(bt21)
    let bt22 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
        (action) in self.QualityLabel.text = "Rash"}
    alert9.addAction(bt22)

    //Create Cancel Action
    let cancel9 = UIAlertAction(title: "CANCEL", style: UIAlertActionStyle.cancel, handler: nil)
    alert9.addAction(cancel9)
    //Create OK Action
    let ok9 = UIAlertAction(title: "INPUT TEXTFIELD", style: UIAlertActionStyle.default) { (action: UIAlertAction) in print("OK")
        let textfield = alert9.textFields?[0]
        print(textfield?.text!)
        self.QualityLabel.text = textfield?.text!
    }
    alert9.addAction(ok9)
    //Add Text Field
    alert9.addTextField { (textfield: UITextField) in
        textfield.placeholder = "Quality"
    }
    //Present Alert Controller
    self.present(alert9, animated:true, completion: nil)
}

,尽管我找到了一种滚动到uialertController Action的顶部的方法,
我不建议这样做,因为我不知道您的应用程序是否会被拒绝。

我认为此答案仅与iOS 10

有关
self.present(alert, animated: true, completion: {
    //print(alert.view)                                              // _UIAlertControllerView
    //print(alert.view.subviews)                                     // [UIView]
    //print(alert.view.subviews[0].subviews)                         // [_UIAlertControllerInterfaceActionGroupView]
    //print(alert.view.subviews[0].subviews[0].subviews)             // [_UIDimmingKnockoutBackdropView, UIView]
    //print(alert.view.subviews[0].subviews[0].subviews[0].subviews) // [UIView, UIVisualEffectView]
    //print(alert.view.subviews[0].subviews[0].subviews[1].subviews) // [_UIInterfaceActionGroupHeaderScrollView, _UIInterfaceActionItemSeparatorView_iOS, _UIInterfaceActionRepresentationsSequenceView]
    // _UIInterfaceActionRepresentationsSequenceView <- This is what we want
    // In this view are all your added actions. It is a subview of UIScrollView, so just cast it and set the contentOffset to zero
    if let scrollView = alert.view.subviews[0].subviews[0].subviews[1].subviews[2] as? UIScrollView {
        scrollView.setContentOffset(.zero, animated: true)
    }
})

这可能不起作用,因为我不检查子视图是否按此顺序。
未来的iOS更新也可能完全崩溃此方法。
我也刚刚在iPhone上测试了这一点。我不知道它在iPad上是否有效。

或多或少安全的方法(欢迎建议):

self.present(alert, animated: true, completion: {
    guard alert.view.subviews.count >= 1 else { return }
    guard alert.view.subviews[0].subviews.count >= 1 else { return }
    guard alert.view.subviews[0].subviews[0].subviews.count >= 2 else { return }
    guard alert.view.subviews[0].subviews[0].subviews[1].subviews.count >= 3 else { return }
    if let scrollView = alert.view.subviews[0].subviews[0].subviews[1].subviews[2] as? UIScrollView {
        scrollView.setContentOffset(.zero, animated: true)
    }
})

这会找到卷轴并滚动到顶部。我们搜索所有子视图,因为多个子视图对setContentOffset响应,但不要打扰检查哪一个。

- (void)methodThatCreatesTheAlertController
{
    // make the alertController here, add actions, and then...
    [self presentViewController:alertController animated:YES completion:^{
        [self scrollToTopOfAlertControllerView:alertController.view];
    }];
}
- (void)scrollToTopOfAlertControllerView:(UIView *)view
{
    for ( UIView *aSubview in view.subviews ) {
        if ( [aSubview respondsToSelector:@selector(setContentOffset:animated:)] ) {
            // _UIInterfaceActionGroupHeaderScrollView
            // _UIInterfaceActionRepresentationsSequenceView <-- this is the one that scrolls
            [((UIScrollView *)aSubview) setContentOffset:CGPointZero animated:YES];
        }
        [self scrollToTopOfAlertControllerView:aSubview]; // recurse
    }
}

使用此代码设置您的AlertController类

https://gist.github.com/petrpavlik/0c5feaada5913cafde8a

最新更新