【问题标题】:How to update textfield.text value in custom TableViewCell from UIPickerView如何从 UIPickerView 更新自定义 TableViewCell 中的 textfield.text 值
【发布时间】:2016-06-05 15:48:20
【问题描述】:

当我从 UIPickerView 中选择一些值时,我希望更新自定义 UITableViewCell 中的 UITextFiled.text。

如果你看一下图片,我点击自定义 UITableViewCell 中的 UITextField 并显示 UIPickerView。然后我选择数字和标签“完成”按钮。但我不知道如何将选定的值从 UIPickerView 传递到我的自定义 UITableViewCell,其中是我的 UITextFiled.text。

谁能帮帮我?谢谢

The screenshot

自定义单元格

class JamkaTableViewCell: UITableViewCell, pickerChangedDelegate {

    @IBOutlet weak var jmenoHraceLabel: UILabel!
    @IBOutlet weak var parTextField: UITextField!

    func onPickerChanged(val: String) {
        self.parTextField.text = val
        print(self.parTextField.text)
    }
 }

视图控制器

import UIKit

protocol pickerChangedDelegate {
    func onPickerChanged(val: String)
}

class JamkaViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {


    @IBOutlet weak var vzdalenostLabel: UILabel!
    @IBOutlet weak var jmenoLabel: UILabel!
    @IBOutlet weak var parJamkyLabel: UILabel!
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var jamkaView: UIView!

    var picker: UIPickerView!
    var karta:Karta = Karta.init()
    var index = 0
    var vzdalenost:Int!
    var jmenoJamky:String = ""
    var parJamky:Int!
    var pocetKopu:[String] = []
    var hrac:Hrac!
    var delegate: pickerChangedDelegate? = nil

    override func viewDidLoad() {
        super.viewDidLoad()

        vzdalenostLabel.text = "\(self.vzdalenost)"
        jmenoLabel.text = self.jmenoJamky
        parJamkyLabel.text = "\(self.parJamky)"

        //Vypocitat pocet kopu a trestných bodů
        pocetKopu(self.parJamky)

        //Jamka view
        self.jamkaView.layer.cornerRadius = 5

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.karta.seznamHracu.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cellIdentifier = "Cell"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! JamkaTableViewCell

            self.hrac = self.karta.seznamHracu[indexPath.row]

            //Vybiratko na pary
            self.picker = UIPickerView.init()
            self.picker.delegate = self
            self.picker.dataSource = self
            self.picker.backgroundColor = svetleSeda

            let pickerToolbar = UIToolbar()
            pickerToolbar.barStyle = .Default
            pickerToolbar.sizeToFit()
            pickerToolbar.tintColor = UIColor.blackColor()

            let hotovoTlacitko = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: #selector(JamkaViewController.skrytPickerView))

            pickerToolbar.setItems([hotovoTlacitko], animated: true)
            pickerToolbar.userInteractionEnabled = true

            cell.parTextField.inputView = self.picker
            cell.parTextField.inputAccessoryView = pickerToolbar
            cell.jmenoHraceLabel.text = self.hrac.jmeno

            print(cell.parTextField.text)

        return cell

    }

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

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

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

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        delegate?.onPickerChanged(self.pocetKopu[row])
        print("did select \(self.pocetKopu[row])")
    }

    func pocetKopu(parJamky: Int) -> [String] {

        let maximalniPocetKopu = (3*parJamky)

        for i in 1...maximalniPocetKopu {

            let str = String(i)
            self.pocetKopu.append(str)

        }

        //Trestne body
        let trestneBody = String(4*parJamky)
        self.pocetKopu.append(trestneBody)

        return self.pocetKopu

    }

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
        let pointInTable:CGPoint = textField.superview!.convertPoint(textField.frame.origin, toView:self.tableView)
        var contentOffset:CGPoint = self.tableView.contentOffset
        contentOffset.y  = pointInTable.y
        if let accessoryView = textField.inputAccessoryView {
            contentOffset.y -= accessoryView.frame.size.height
        }
        self.tableView.contentOffset = contentOffset
        return true;
    }

    func textFieldDidEndEditing(textField: UITextField) {
        self.tableView.setContentOffset(CGPointMake(0, 0), animated: true)
        scrollView.setContentOffset(CGPointMake(0, 0), animated: true)
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

    func skrytPickerView() -> () {
        self.view.endEditing(true)
    }

}

【问题讨论】:

    标签: swift uipickerview


    【解决方案1】:

    你需要像这样实现pickerView的didSelectRow:

    //create delegate in controller that contains picker
    protocol pickerChangedDelegate{
        func onPickerChanged(val: String)
    }
    
    
    class vc: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate{
        @IBOutlet var picker: UIPickerView!
    
        //your view controller ....
        //....
    
    
        var delegate: pickerChangedDelegate? = nil
        var items = ["1", "2", "3"]
    
        func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            return items.count
        }
    
        func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
            return 1
        }
    
        func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            //this will send picker value through protocol to your cell
            delegate?.onPickerChanged(items[row])
        }
    }
    
    
    
    //use delegate where you want data
    class customCell: UITableViewCell, pickerChangedDelegate{
        @IBOutlet weak var myText: UITextField!
    
        //Cell setup
        //....
        //....
    
    
        func onPickerChanged(val: String) {
            myText.text = val
        }
    }
    

    【讨论】:

    • 感谢您的建议。我正在使用自定义单元格,但是我是初学者,我不明白“您可以在单元格本身中处理此问题并使用 protocl 将数据发送到 ypur 表的查看控制器”,请您提供任何代码我如何实现它还是更多解释?非常感谢
    • @MiroslavPurtík 我更新了代码以及如何使用协议在单元格中获取数据。
    • 谢谢你的回答我按照你的代码做了所有的事情但是delegate?.onPickerChanged(self.pocetKopu[row]) 永远不会执行:(请检查我上面的代码。非常感谢你跨度>
    【解决方案2】:
    class vContoller: UIViewController ,  UITextFieldDelegate , UIPickerViewDataSource , UIPickerViewDelegate {
    
    
    @IBOutlet var accountNo: UITextField! 
    
    var accountNoArray: [String] = [String]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
     accountNoArray = ["1","2"]
     self.accountNo.delegate = self
    }
    
    
    
    
    func pickerCode(text: UITextField){
    
    
    
        let picker: UIPickerView
        picker = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 300))
        picker.backgroundColor = .whiteColor()
        picker.showsSelectionIndicator = true
        picker.delegate = self
        picker.dataSource = self
    
        let toolBar = UIToolbar()
        toolBar.barStyle = UIBarStyle.Default
        toolBar.translucent = true
        toolBar.sizeToFit()
    
        let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker")
        let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
        let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "canclePicker")
    
        toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
        toolBar.userInteractionEnabled = true
    
        if text.tag == 2
        {
            self.tagMaster = 2
            accountNo.inputAccessoryView = toolBar
            accountNo.inputView = picker
            //accountNo.text = "  " + accountNoArray[0]
        }
    }
    
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{
    
        return 1
    
    }
    
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
        var count: Int = 0
        if self.tagMaster == 2
        {//accountNo
            count = accountNoArray.count
        }
        return count
    }
    
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        var stro:String = ""
        if self.tagMaster == 2
        {//accountNo
            stro = accountNoArray[row]
        }
        return stro
    
    }
    
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    
        if self.tagMaster == 2
        {//accountNo
            accountNo.text = "  " + accountNoArray[row]
    
    
        }
    }
    
    func donePicker(){
    
        accountNo.resignFirstResponder()
        if self.tagMaster == 2
        {
            accountNo.resignFirstResponder()
    
        }
    }
    
    func canclePicker(){
    
        if self.tagMaster == 2
        {
            accountNo.resignFirstResponder()
    
            accountNo.text = "  " + accountNoArray[selectedRowForAccNoAndLbrCode]
        }
    
    }
    
    
    func textFieldDidEndEditing(textField: UITextField) {
    
        pickerCode(textField)
    }
    
    func textFieldDidBeginEditing(textField: UITextField) {
    
        pickerCode(textField)
    }
    
    ////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////
    

    【讨论】:

    • 谢谢,我会尽力让你知道 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    相关资源
    最近更新 更多