如何在UITableViewController中使用UIPickerView

时间:2017-03-29 12:33:45

标签: ios swift xcode uitableview

您好我有一个表视图控制器名称为MyTableViewController。在MyTableViewController中,我在表的UIPickerView内使用了不同的cell,其名称为headerCell,由以下函数设置,并且我没有使用任何{ {1}}

UIPickerView

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerCell = tableView.dequeueReusableCell(withIdentifier: "header") as! MyTableViewCell headerCell.contentView.backgroundColor = UIColor.white return headerCell } MyTableViewCell类的类,其中我附加了所有表格布局,例如UITableViewCellLabelTextFieldButton等等。

我的第二个单元格为UIPickerViewmiddleCell,为

footerCell

你可以看到有不同的override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell : SubscriptionTableViewCell? if indexPath.row == 1 { cell = tableView.dequeueReusableCell(withIdentifier: "footer", for: indexPath) as? SubscriptionTableViewCell cell!.cardTypePicker.delegate = self cell!.expMonth.delegate = self cell!.expYear.delegate = self cell!.countryPicker.delegate = self cell!.shippingMethodPicker.delegate = self cell!.cardTypePicker.dataSource = self cell!.expMonth.dataSource = self cell!.expYear.dataSource = self cell!.countryPicker.dataSource = self cell!.shippingMethodPicker.dataSource = self }else { cell = tableView.dequeueReusableCell(withIdentifier: "middle", for: indexPath) as? SubscriptionTableViewCell cell!.variantPicker.delegate = self cell!.variantPicker.dataSource = self } return cell! } 。 所以现在我无法理解我应该如何在UIPickerView内使用UIPickerView个代表。

请帮助谢谢。

3 个答案:

答案 0 :(得分:1)

class TableViewCell:UITableViewCell {

@IBOutlet var pickerView: UIPickerView!

var arrCountryName : [String] = []

override func awakeFromNib() {
    super.awakeFromNib()

    arrCountryName = ["India" , "Australia"]
    pickerView.delegate = self
    pickerView.dataSource = self
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

扩展TableViewCell:UIPickerViewDataSource,UIPickerViewDelegate {

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return arrCountryName.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return arrCountryName[row]
}   

}

答案 1 :(得分:1)

您要问的术语是Inline Picker。实现此功能的方法有很多种。您可以在UIPickerView中添加UITableViewCell,并使其高度限制,您可以根据需要进行修改。如果您想使用第三方选择器,请参阅以下链接:

https://github.com/sebamisc/UItableViewWithPicker

答案 2 :(得分:0)

UIView上有一个名为tag的属性,您可以将其用于任何目的。您可以将表的行号分配给它,然后在委托中检查它。

如果可以插入或删除行,则需要小心 - 您需要重新加载受影响的行并更新标记。

编辑(另一种方式):

您无需为每个选择器分配相同的委托。您可以创建实现委托协议的新类。

所以,

class CountryPickerDelegate: UIPickerDelegate {

// do what the country picker needs
// The init can take the VC if you need that.
// add a weak var viewController: MyTableViewController? = nil 

}

class CardTypePickerDelegate: UIPickerDelegate {

// do what the card picker needs
// The init can take the VC if you need that.
// add a weak var viewController: MyTableViewController = nil

}

然后,

cell!.countryPicker.delegate = CountryPickerDelegate(viewController: self)