2015-09-21 1 views
0

Я пытаюсь создать UIPickerView программно и отобразить его ряды в листе действий. Однако ничего не работает. Вот упрощенный пример подобного неработающего кода:UIPickerView в листе действий UIAlertController не отображает никаких данных

import UIKit 

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 

    let array = ["one","two","three","four","five"] 
    var controller: UIAlertController? 
    var pickerView = UIPickerView(frame: CGRectMake(0, 15, 304, 0)) 

    @IBOutlet weak var button: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     controller = UIAlertController(title: "Choose Category", message: "\n\n\n\n\n\n\n\n", preferredStyle: .ActionSheet) 
     let doneAction = UIAlertAction(title: "Done", style: .Default, handler: nil) 
     controller!.addAction(doneAction) 

     pickerView.delegate = self 
     pickerView.dataSource = self 
    } 

    @IBAction func buttonPressed(sender: AnyObject) { 
     controller!.view.addSubview(self.pickerView) 
     self.presentViewController(controller!, animated: true, completion: nil) 
    } 

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
     return 1 
    } 

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return array.count 
    } 

    func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { 
     return 50.0 
    } 

    func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView { 
     let view = UIView(frame: CGRectMake(0, 0, 100, 70)) 

     let label = UILabel(frame: CGRectMake(50, 5, 100, 60)) 
     label.text = array[row] as String 

     view.insertSubview(label, atIndex: 1) 

     return view 
    } 
} 

Когда кнопка нажата, это выход:

Screenshot of a UIAlertController being displayed on an iPhone 4S

Как вы можете видеть, лист действие не является заполненный значениями массива. Все это работало должным образом, прежде чем я обновился до iOS 9 и Swift 2.0. Я использовал print, чтобы убедиться, что методы pickerView вызываются, какие они есть, и даже используя print, чтобы проверить значение label и view, и они есть. Может ли кто-нибудь либо направлять меня в направлении, либо объяснять, что не может быть отображено?

Также: Еще одна напуганная вещь - как эти методы называются. Если я нажимаю на кнопку один раз, это порядок каждого вызова метода, что происходит:

numberOfComponentsInPickerView: 
numberOfComponentsInPickerView: 
rowHeightForComponent: 
rowHeightForComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfComponentsInPickerView: 
numberOfRowsInComponent: 
viewForRow: 
viewForRow: 
numberOfComponentsInPickerView: 
rowHeightForComponent: 
rowHeightForComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
numberOfRowsInComponent: 
viewForRow: 
viewForRow: 
viewForRow: 
viewForRow: 
viewForRow: 
+0

Где код, который добавляет представление подбора к оповещению? Где код, представляющий предупреждение? – rmaddy

+0

Я забыл эту строку, но я только что отредактировал и добавил ее. Добавление происходит в buttonPressed action. – Aaron

+0

Попробуйте увеличить значение 'y' в представлении представления выбора, пока оно не появится. Конечно, вы понимаете, что то, что вы делаете, не поддерживается, не так ли? В документах для 'UIAlertController' четко указано: * Иерархия представления для этого класса является частной и не должна быть изменена. * – rmaddy

ответ

1

Вы не должны изменять иерархию представление по UIAlertController. Даже если вы можете заставить его работать таким образом, вы рискуете Apple сломать его в любое время, когда есть обновление, и вам придется искать новые обходные пути, чтобы заставить его работать. Возможно, вам захочется рассмотреть вопрос о том, чтобы поместить ваш сборщик в контроллер просмотра и представить его как UIModalPresentationPopover. Если вы используете его с подклассом ответчика, как текстовое поле или пользовательский, который вы делаете, вы также можете сделать представление, которое выглядит как лист действий с помощью сборщика и установить его как ответчик inputView.