UIAlertController 操作 sheet 中的 UIPickerView 未显示任何数据
UIPickerView within UIAlertController action sheet is not displaying any data
我正在尝试以编程方式创建 UIPickerView 并在操作中显示它的行 sheet。但是,似乎没有任何效果。这是类似的非工作代码的简化示例:
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
}
}
按下按钮时,这是输出:
如您所见,操作 sheet 未填充数组值。在我升级到 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:
您不应该修改 UIAlertController 的视图层次结构。即使您可以让它以这种方式工作,您也有可能在更新时随时冒着 Apple 破坏它的风险,并且您必须不断寻找新的解决方法才能使其工作。您可能需要考虑将选择器放入视图控制器中并将其呈现为 UIModalPresentationPopover
。
如果您将它与响应器子类一起使用,例如文本字段或您制作的自定义子类,您还可以使用选择器制作一个看起来像动作 sheet 的视图,并将其设置为 inputView
响应者。
我正在尝试以编程方式创建 UIPickerView 并在操作中显示它的行 sheet。但是,似乎没有任何效果。这是类似的非工作代码的简化示例:
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
}
}
按下按钮时,这是输出:
如您所见,操作 sheet 未填充数组值。在我升级到 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:
您不应该修改 UIAlertController 的视图层次结构。即使您可以让它以这种方式工作,您也有可能在更新时随时冒着 Apple 破坏它的风险,并且您必须不断寻找新的解决方法才能使其工作。您可能需要考虑将选择器放入视图控制器中并将其呈现为 UIModalPresentationPopover
。
如果您将它与响应器子类一起使用,例如文本字段或您制作的自定义子类,您还可以使用选择器制作一个看起来像动作 sheet 的视图,并将其设置为 inputView
响应者。