在UITableViewCell中使用UIStepper增加标签值

时间:2018-03-26 09:08:53

标签: ios swift uitableview uistepper

我希望能够使用位于每个tableview行中的UIStepper。我希望每个UIStepper都能更新UIStepper所在的同一个tableview行中的标签。

我正在尝试的代码如下

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cartListCell = tableView.dequeueReusableCell(withIdentifier: reuseCartListingCellIdentifier, for: indexPath) as? CartListingItemTableViewCell

        cartListCell?.UI_STEPPER_NAME.value = VALUE_FROM_ARRAY

        return cartListCell!

}


@IBAction func CartStoreQtyStepperAction(_ sender: UIStepper) {


        // I need to update the value of a label in the tableview cell that tapped

    }

更新后的实施

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        cartListCell?.CartListingProductQtyStepperOutlet.tag = indexPath.row
     cartListCell?.CartListingProductQtyStepperOutlet.addTarget(self, action: #selector(self.CartStoreQtyStepperAction(_:)), for: UIControlEvents.valueChanged)
        cartListCell?.tag         =   Int(CartStoreItemIdArray [indexPath.row])!
        return cartListCell!
}


@IBAction func CartStoreQtyStepperAction(_ sender: UIStepper) 
{

            let stepperValue = Int(sender.value)
            let indexPath = IndexPath(row: stepperValue, section: 0)
            print(stepperValue)

           if let cell = yourTableView.cellForRow(at: indexPath) as? CartListingItemTableViewCell 
    {
        print(cell?.tag)
    }

}

当我这样做时,我无法访问tableview单元格和标签。有人可以指导我怎么做吗?

4 个答案:

答案 0 :(得分:1)

// Custom tableview cell code
class CartListingItemTableViewCell: UITableViewCell {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var stepper: UIStepper!

}

//您的视图控制器代码(tableview数据源)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cartListCell = tableView.dequeueReusableCell(withIdentifier: reuseCartListingCellIdentifier, for: indexPath) as? CartListingItemTableViewCell

    let stepperValue = yourArray[indexPath.row]
    cartListCell?.label.text = String(stepperValue) ?? "0"
    cartListCell?.stepper.value = Int(stepperValue) ?? 0
    cartListCell?.stepper.tag = indexPath.row
    cartListCell?.stepper.addTarget(self, action: #selector(self.stepperValueChanged(_:)), for: UIControlEvents.valueChanged)

    return cartListCell!

}


// handle stepper value change action
@IBAction func stepperValueChanged(_ stepper: UIStepper) {

    let stepperValue = Int(stepper.value)
    print(stepperValue) // prints value

    let indexPath = IndexPath(row: stepperValue, section: 0)
    if let cell = yourTableView.cellForRow(at: indexPath) as? CartListingItemTableViewCell {
        cell.label.text = String(stepperValue)
        yourValueArray[index] = stepperValue

    }
}

答案 1 :(得分:0)

将标记值分配给UISteppercellForRowAt的发件人,并使用相同标记访问UIStepper操作中CartStoreQtyStepperAction值的更改。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cartListCell = tableView.dequeueReusableCell(withIdentifier: reuseCartListingCellIdentifier, for: indexPath) as? CartListingItemTableViewCell

        //Assign tag value
        cartListCell?.UI_STEPPER_NAME.tag = indexPath.row
        cartListCell?.UI_STEPPER_NAME.value = VALUE_FROM_ARRAY
        cartListCell?.stepper.addTarget(self, action: #selector(self.CartStoreQtyStepperAction(_:)), for: UIControlEvents.valueChanged)

        return cartListCell!
}


@IBAction func CartStoreQtyStepperAction(_ sender: UIStepper) {

    let index = sender.tag
    yourValueArray[index] = sender.value
    //Reload particular cell for tableView
}

答案 2 :(得分:0)

Swift 4的解决方案

  1. cellforRowAt

    中添加这些行
    cartListCell.UI_STEPPER_NAME.tag = indexPath.row
    cartListCell.UI_STEPPER_NAME.addTarget(self, action: #selector(CartStoreQtyStepperAction), for: .touchUpInside)
    
  2. 要访问步进器功能中的单元格项目,请使用此行。

    let cartListCell = sender.superview?.superview as! CartListingItemTableViewCell
    
    //check whether your superview is table cell.
    //then use the cell instance to update the cell label
    
  3. 例如,在函数中使用sender.tag来访问特定单元格。

    cartListCell.UI_STEPPER_NAME.text = "\(VALUE_FROM_ARRAY[sender.tag])"
    
    //sender.tag is similar to indexPath.row as we pass the tag value in the cellforRowAt. 
    //It will work then please accept my answer.       
    

答案 3 :(得分:0)

这是使用NSKeyValueObservation

的Swift 4的解决方案
  • 首先,您需要在数据模型中使用属性来保持步进器的当前值。

    var counter = 0.0
    
  • 在自定义单元格中为步进器和标签创建出口,并为观察创建属性。连接插座。

    @IBOutlet weak var stepper : UIStepper!
    @IBOutlet weak var label : UILabel!
    
    var observation : NSKeyValueObservation?
    
  • cellForRow的控制器中添加观察者,dataSourceArray是数据源数组。

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let cartListCell = tableView.dequeueReusableCell(withIdentifier: reuseCartListingCellIdentifier, for: indexPath) as! CartListingItemTableViewCell
        let item = dataSourceArray[indexPath.row]
        cartListCell.stepper.value = item.counter
        cartListCell.label.text = "\(item.counter)"
    
        cartListCell.observation = cell.stepper.observe(\.value, options: [.new]) { (_, change) in
            cartListCell.label.text = "\(change.newValue!)"
            item.counter = change.newValue!
        }
    
        return cartListCell
    }