2017-02-23 2 views
1

Bitte helfen Sie! :) Ich bin hier ein riesiges Noobie. Ich habe diesen Code aus verschiedenen Quellen gesammelt, so dass ich nicht wirklich weiß, was ich mache. Mein Alarm Controller zeigt a textfield that I can write in, a 'cancel' action, an 'ok' action, und es zeigt auch multiple 'input keyword to label' actions.Wie scrollt man durch Aktionen im Alert Controller? Xcode 8, Swift 3, IOS

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. Es sieht hässlich aus und einige der Tasten, die Sie nicht berühren können. Gibt es eine Möglichkeit, durch meine Aktionen zu scrollen, damit sie in diesen Raum passen?

Dies ist mein Code für das letzte Bild:

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

Ja, Sie haben Recht dies sehr hässlich ist, glaube ich Ihnen noch eine View-Controller, Textfeld nach oben View-Controller-Set erstellen, und Setzen Sie die Tabellenansicht unterhalb des Textfelds, und setzen Sie den gesamten Text der Schaltfläche in die Tabellenansichtszelle. Zeigen Sie den Ansichtscontroller an, wenn Sie auf die Schaltfläche "Qualität" tippen. Dies ist das Beste für Sie, denke ich. – Vivek

Antwort

1

Obwohl ich einen Weg gefunden, an die Spitze der UIAlertController Aktionen zu bewegen,
Ich empfehle dies nicht, weil ich nicht weiß, ob Ihre App abgelehnt werden würde.

Ich glaube, diese Antwort nur relevant für iOS ist 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) 
    } 
}) 

Das ist nicht einmal arbeiten kann, weil ich nicht überprüfen, ob die Subviews in dieser Reihenfolge sind.
Ein zukünftiges iOS-Update könnte diese Methode ebenfalls komplett zum Absturz bringen.
Auch ich habe es gerade auf einem iPhone getestet. Ich weiß nicht, ob es auf einem iPad funktioniert.

Eine mehr oder weniger sichere Art und Weise (Vorschläge willkommen):

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

mit diesem Code Ihre alertcontroller Klasse gesetzt

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

+0

Aus  Dokumentation: 'Die UIAlertController-Klasse ist so zu verwenden wie sie ist und unterstützt keine Unterklassenbildung. Die Ansichtshierarchie für diese Klasse ist privat und darf nicht geändert werden. " –

+0

vielleicht habe ich es falsch beschrieben. Was ist falsch an diesem Personencode? – DanielG

Verwandte Themen