如何滚动警报控制器中的操作? Xcode 8 个,Swift 3 个,IOS

How to scroll through actions in alert controller? Xcode 8, Swift 3, IOS

请帮忙! :) 我是这里的大菜鸟。我从各种来源收集了这段代码,所以我真的不知道自己在做什么。我的警报控制器显示 a textfield that I can write in, a 'cancel' action, an 'ok' action, and it also displays 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. 外观丑陋,有些按键不能触摸。有没有办法滚动浏览我的操作以使其适合此 space?

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

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

使用此代码

设置您的警报控制器class

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

虽然我找到了一种滚动到 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)
    }
})

这会找到 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
    }
}