我有一个ViewController,UIPickerView作为单个控件myPickerView,它属于类MyPickerView,是作为UIPickerView的子类创建的。我通过myPickerView调用ViewController viewDidLoad中的myPickerView.viewDidLoad。但是,这并不会执行MyPickerView的源函数。
我需要澄清一下我怎样才能做到这一点。我之所以使用MyPickerView,是因为它有很多特殊的代码,我不想把主ViewController弄乱。参见下面的示例代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myPickerView: MyPickerView!
override func viewDidLoad() {
super.viewDidLoad()
myPickerView.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
import UIKit
var gSep = ","
class MyPickerView: UIPickerView , UIPickerViewDataSource, UIPickerViewDelegate {
var pickerData = [[" "],[" "]]
var category = [""]
var subCategory = [""]
var dictMenuList = [String:String]()
//MARK:- category/subcategory picker
func viewDidLoad() {
println("MyPickerView: viewDidLoad")
dictMenuList = ["Medical":"Sub-Cat 1.1,Sub-Cat 1.2,Sub-Cat 1.3,Sub-Cat 1.4,Sub-Cat 1.5,Sub-Cat 1.6,Sub-Cat 1.7",
"Taxes": "Sub-Cat 2.1,Sub-Cat 2.2,Sub-Cat 2.3,Sub-Cat 2.4",
"Bills": "Sub-Cat 3.1,Sub-Cat 3.2,Sub-Cat 3.3,Sub-Cat 3.4,Sub-Cat 3.5,Sub-Cat 3.6,Sub-Cat 3.7"]
println("MyPickerView dictMenuList: \(dictMenuList)")
self.reloadAllComponents()
let firstKey = self.loadPickerWithCategory(0)
self.loadPickerWithSubCategory(firstKey)
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
println("MyPickerView: numberOfComponentsInPickerView \(pickerData.count)")
return pickerData.count
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData[component].count
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if component == 0 {
let selectedKey = category[row]
loadPickerWithSubCategory(selectedKey)
}
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return pickerData[component][row]
}
func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView
{
var pickerLabel = UILabel()
pickerLabel.textColor = UIColor.blackColor()
pickerLabel.text = pickerData[component][row]
pickerLabel.font = UIFont(name: pickerLabel.font.fontName, size: 17)
pickerLabel.textAlignment = NSTextAlignment.Center
return pickerLabel
}
func loadPickerWithCategory (row: Int) -> String{
println("loadPickerWithCategory")
category = [String](dictMenuList.keys)
println("MyPickerView: category: \(category)")
if category.isEmpty {
return ""
}
let n1 = dictMenuList.count
pickerData[0].removeAll(keepCapacity: true)
for i in 0 ..< n1
{
pickerData[0].append(category[i])
}
return category[row]
}
func loadPickerWithSubCategory (key: String) {
println("MyPickerView: loadPickerWithSubCategory")
let x = dictMenuList[key]
subCategory = x!.componentsSeparatedByString(gSep)
let n1 = subCategory.count
pickerData[1].removeAll(keepCapacity: true)
if subCategory.isEmpty {
return
}
for i in 0 ..< n1
{
pickerData[1].append(subCategory[i])
}
self.reloadAllComponents()
}
}
发布于 2015-05-04 09:39:37
方法viewDidLoad
是视图控制器方法,而不是视图方法。UIPickerView
是UIView
的子类,而不是UIViewController
的子类,因此系统不会调用viewDidLoad
方法。
您需要覆盖一个或多个init方法。
如果要从Storyboard或XIB加载选择器视图,则可能要重写initWithCoder。
如果要在代码中创建选择器,则可能要重写initWithFrame。
有时,我创建一个方法setup
,我从initWithCoder:
和initWithFrame:
调用该方法。这样,无论如何加载视图对象,我的设置代码都会被调用。
我隐约记得在Swift中有一种更好的方法来处理这个决斗的初始化者问题,但是我不记得它是什么。(我还在学斯威夫特。)
编辑:
我突然意识到,在加载视图并设置了所有的输出后,您可以使用awakeFromNib
方法进行安装。这大致相当于viewDidLoad
对视图控制器的调用。我应该早点想到的。
(awakeFromNib
是NSObject的一种方法,如果您不知道它的存在,就很难找到它。)
发布于 2015-05-04 09:36:22
首先,viewDidLoad()
是UIViewController
类的一个方法,在控制器的视图加载到内存后调用。阅读更多的这里。您不能在视图中使用它。
因此,您应该在自定义选择器类中实现一个init
方法。我建议重写initWithFrame
和initWithCoder
,并在那里设置组件。
您将像这样初始化您的自定义选择器:
myPickerView = MyPickerView(frame: yourFrame)
https://stackoverflow.com/questions/30035850
复制相似问题