【发布时间】:2015-12-18 18:41:25
【问题描述】:
我正在尝试以编程方式创建 UIPickerView 并在操作表中显示它的行。但是,似乎没有任何效果。这是一个类似的非工作代码的简化示例:
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
}
}
按下按钮时,输出如下:
如您所见,操作表并未填充数组值。在我升级到 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:
【问题讨论】:
-
将选择器视图添加到警报的代码在哪里?显示警报的代码在哪里?
-
我忘记了那行,但我只是编辑并添加了它。添加发生在 buttonPressed 操作中
-
尝试增加选择器视图原点的
y值直到它出现。当然,您是否意识到您正在做的事情不受支持,对吗?UIAlertController的文档明确指出:此类的视图层次结构是私有的,不得修改。 -
@rmaddy 谢谢,我现在就试试。你会说我在底部添加的所有调用是怎么回事?
-
这意味着你的选择器正在工作。它只是不在正确的地方。但同样,不要这样做。不支持向
UIAlertController添加选择器视图(或其他任何内容),并且您为使其正常工作所做的任何事情都是一种 hack,可能会因任何新的 iOS 版本而中断。
标签: ios swift uipickerview uialertcontroller