如何让图像出现在Swift中的UI PickerView组件中?

我想在Swift PickerView中使用图像。 我不知道如何让图像真正出现在组件中。 我知道如何使用带有titleForRow函数的string来做到这一点,但我不知道如何使用图像来做到这一点。 这是我的代码到目前为止:

import UIKit class ViewController: UIViewController, UIPickerViewDelegate { @IBOutlet weak var pickerView: UIPickerView! var imageArray: [UIImage] = [UIImage(named: "washington.jpg")!, UIImage(named: "berlin.jpg")!, UIImage(named: "beijing.jpg")!, UIImage(named: "tokyo.jpg")!] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // returns the number of 'columns' to display. func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{ return 1 } // returns the # of rows in each component.. func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return imageArray.count } }// end of app 

您需要为UIPickerViewDelegate协议实现更多的委托方法。 特别是一个rowHeight委托方法和一个viewForRow委托方法。

就像是:

 // MARK: UIPickerViewDataSource func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { return 1 } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return 2 } func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { return 60 } // MARK: UIPickerViewDelegate func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView { var myView = UIView(frame: CGRectMake(0, 0, pickerView.bounds.width - 30, 60)) var myImageView = UIImageView(frame: CGRectMake(0, 0, 50, 50)) var rowString = String() switch row { case 0: rowString = “Washington” myImageView.image = UIImage(named:"washington.jpg") case 1: rowString = “Beijing” myImageView.image = UIImage(named:"beijing.jpg") case 2: default: rowString = "Error: too many rows" myImageView.image = nil } let myLabel = UILabel(frame: CGRectMake(60, 0, pickerView.bounds.width - 90, 60 )) myLabel.font = UIFont(name:some font, size: 18) myLabel.text = rowString myView.addSubview(myLabel) myView.addSubview(myImageView) return myView } func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { // do something with selected row } 

请注意,标签布局等只是为了演示,将需要调整,或者可能更好地使用自动布局等。

我有同样的问题,并做了一些研究,直到我明白了。 这是一个对我很好的例子。 只要确保您的资产文件夹中的图像都命名为您的案例string相同,你会被设置!

 @IBOutlet weak var pickerView: UIPickerView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. pickerView.delegate = self } // MARK: UIPickerViewDataSource func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { return 1 } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return 11 } // MARK: UIPickerViewDelegate func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView { var myImageView = UIImageView() switch row { case 0: myImageView = UIImageView(image: UIImage(named:"airplane")) case 1: myImageView = UIImageView(image: UIImage(named:"beach")) case 2: myImageView = UIImageView(image: UIImage(named:"bike")) case 3: myImageView = UIImageView(image: UIImage(named:"hiking")) case 4: myImageView = UIImageView(image: UIImage(named:"ironman")) case 5: myImageView = UIImageView(image: UIImage(named:"moneybag")) case 6: myImageView = UIImageView(image: UIImage(named:"moneybills")) case 7: myImageView = UIImageView(image: UIImage(named:"ninjaturtle")) case 8: myImageView = UIImageView(image: UIImage(named:"running")) case 9: myImageView = UIImageView(image: UIImage(named:"shoppingcart")) case 10: myImageView = UIImageView(image: UIImage(named:"workingout")) default: myImageView.image = nil return myImageView } return myImageView } func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { // do something with selected row } 

处理大量内容时,制作switch语句可能会很乏味。

相反,像这样使用for循环

 for _ in 1..<imageArray.count { myImageView.image = UIImage(named: imageArray[row]) } 

你不需要子类UIPickerView (事实上​​,这可能不是一个聪明的观点子类无论如何)。 相反,你需要有一个实现UIPickerViewDelegate协议的对象。 在这个对象中你会实现这个方法

 optional func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView 

此方法提供了各个组件的视图。 在该方法中,您将从图像数组中返回适当的值。