【问题标题】:How to scroll through actions in alert controller? Xcode 8, Swift 3, IOS如何滚动警报控制器中的操作? Xcode 8、Swift 3、IOS
【发布时间】:2017-02-23 18:41:14
【问题描述】:

请帮忙! :) 我在这里是个大菜鸟。我从各种来源收集了这段代码,所以我真的不知道我在做什么。我的警报控制器显示a textfield that I can write in, a 'cancel' action, an 'ok' action,,它还显示multiple 'input keyword to label' actions.

It has so many actions (around 20 keyword actions that i need) that it either doesn't fit in the screen, it is covered by the keyboard, or it is in the way of the keyboard. 看起来很丑,有些按钮你不能碰。有没有办法滚动浏览我的操作以使其适合这个空间?

这是我最后一张图片的代码:

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

【问题讨论】:

  • 是的,你说得对,这很丑,我想你再创建一个视图控制器,将文本字段设置为视图控制器的顶部,并将表格视图放在文本字段的下方,并设置所有按钮文本进入 tableview 单元格,点击质量按钮时显示视图控制器,这对我来说是最好的。

标签: ios scroll swift3 uialertcontroller


【解决方案1】:

虽然我找到了一种滚动到 UIAlertController 操作顶部的方法,
我不建议这样做,因为我不知道你的应用是否会被拒绝。

我认为这个答案只适用于 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)
    }
})

【讨论】:

    【解决方案2】:

    这会找到 scrollView 并滚动到顶部。我们搜索所有子视图,因为不止一个子视图响应 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
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用此代码设置您的警报控制器类

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

      【讨论】:

      • 来自 文档:The UIAlertController class is intended to be used as-is and does not support subclassing. The view hierarchy for this class is private and must not be modified.
      • 也许我描述错了。那个人的代码有什么问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多