首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用UIPickerView inSwift的子类?

如何调用UIPickerView inSwift的子类?
EN

Stack Overflow用户
提问于 2015-05-04 17:08:17
回答 2查看 272关注 0票数 0

我有一个ViewController,UIPickerView作为单个控件myPickerView,它属于类MyPickerView,是作为UIPickerView的子类创建的。我通过myPickerView调用ViewController viewDidLoad中的myPickerView.viewDidLoad。但是,这并不会执行MyPickerView的源函数。

我需要澄清一下我怎样才能做到这一点。我之所以使用MyPickerView,是因为它有很多特殊的代码,我不想把主ViewController弄乱。参见下面的示例代码:

代码语言:javascript
复制
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()
}

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-04 17:39:37

方法viewDidLoad是视图控制器方法,而不是视图方法。UIPickerViewUIView的子类,而不是UIViewController的子类,因此系统不会调用viewDidLoad方法。

您需要覆盖一个或多个init方法。

如果要从Storyboard或XIB加载选择器视图,则可能要重写initWithCoder。

如果要在代码中创建选择器,则可能要重写initWithFrame。

有时,我创建一个方法setup,我从initWithCoder:initWithFrame:调用该方法。这样,无论如何加载视图对象,我的设置代码都会被调用。

我隐约记得在Swift中有一种更好的方法来处理这个决斗的初始化者问题,但是我不记得它是什么。(我还在学斯威夫特。)

编辑:

我突然意识到,在加载视图并设置了所有的输出后,您可以使用awakeFromNib方法进行安装。这大致相当于viewDidLoad对视图控制器的调用。我应该早点想到的。

(awakeFromNib是NSObject的一种方法,如果您不知道它的存在,就很难找到它。)

票数 0
EN

Stack Overflow用户

发布于 2015-05-04 17:36:22

首先,viewDidLoad()UIViewController类的一个方法,在控制器的视图加载到内存后调用。阅读更多的这里。您不能在视图中使用它。

因此,您应该在自定义选择器类中实现一个init方法。我建议重写initWithFrameinitWithCoder,并在那里设置组件。

您将像这样初始化您的自定义选择器:

代码语言:javascript
复制
myPickerView = MyPickerView(frame: yourFrame)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30035850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档