Степпер в ячейке таблицы (быстро)

Я помещаю stepper как выходы, так и действие в ячейку tableview и использую делегат протокола, чтобы подключить его к tableview. Когда я нажал степпер в первой строке, значение степпера обычно отображается в первой строке, но также появляется в какой-то случайной строке. как это исправить?

TableViewCell

protocol ReviewCellDelegate{
    func stepperButton(sender: ReviewTableViewCell)
}

class ReviewTableViewCell: UITableViewCell {
   @IBOutlet weak var countStepper: UIStepper!
   @IBOutlet weak var stepperLabel: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

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

    // Configure the view for the selected state
}

@IBAction func stepperButtonTapped(sender: UIStepper) {
    if delegate != nil {
        delegate?.stepperButton(self)
        stepperLabel.text = "x \(Int(countStepper.value))"

    }
}

Вьюконтроллер

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cellIdentifier = "reviewCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! ReviewTableViewCell


    var imageView: UIImageView?
    let photoG = self.photos[indexPath.row]
    imageView = cell.contentView.viewWithTag(1) as? UIImageView
    //let layout = cell.goodiesImage
    let tag = indexPath.row // +1
    cell.tag = tag
    photoG.fetchImageWithSize(CGSize(width: 1000, height: 1000), completeBlock: { image, info in
        if cell.tag == tag {
            imageView?.image = image
            cell.goodiesImage.image = image
        }
    })

func stepperButton(sender: ReviewTableViewCell) {
    if let indexPath = tableView.indexPathForCell(sender){
        print(indexPath)
    }
}

person Aldo Lazuardi    schedule 19.01.2016    source источник
comment
Ячейки, возвращенные из очереди Reusable CellWithIdentifier, повторно используются, когда пользователь прокручивает табличное представление, вам необходимо соответствующим образом обновить каждое представление.   -  person A-Live    schedule 19.01.2016
comment
привет @A-Live как его обновить?   -  person Aldo Lazuardi    schedule 19.01.2016
comment
в любом случае, я только что обновил свой код здесь, потому что я забыл его скопировать, где я должен поместить этот код stepperLabel.text = x (Int (countStepper.value))?   -  person Aldo Lazuardi    schedule 19.01.2016


Ответы (4)


Как уже упоминалось @A-Live, ваш компонент используется повторно, поэтому его необходимо обновить.

Итак, в вашем контроллере представления:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cellIdentifier = "reviewCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! ReviewTableViewCell


    var imageView: UIImageView?
    let photoG = self.photos[indexPath.row]
    imageView = cell.contentView.viewWithTag(1) as? UIImageView
    //let layout = cell.goodiesImage
    let tag = indexPath.row // +1
    cell.tag = tag
    photoG.fetchImageWithSize(CGSize(width: 1000, height: 1000), completeBlock: { image, info in
    if cell.tag == tag {
        imageView?.image = image
        cell.goodiesImage.image = image
    }
})
    cell.countStepper.value = XXX[indexPath.row].value; //Here you update your view
    cell.stepperLabel.text = "x \(Int(cell.countStepper.value))" //And here

А также

func stepperButton(sender: ReviewTableViewCell) {
    if let indexPath = tableView.indexPathForCell(sender){
        print(indexPath)
        XXX[sender.tag].value = sender.counterStepper.value //Here you save your updated value
}
person Cyril    schedule 19.01.2016

Сбросьте значение степпера при загрузке вашей ячейки. вы можете сбросить значения свойств ячейки в методе ячейки prepareForReuse. добавьте следующий метод в свой класс ReviewTableViewCell.

 override func prepareForReuse() 
 {
   super.prepareForReuse()

   countStepper.value = 0.0 
 }
person Ravi    schedule 19.01.2016
comment
привет @raki, он все еще передает значение в другую ячейку - person Aldo Lazuardi; 19.01.2016

В ВК tableViewCell:

1 - добавить это поле

var cellDelegate: cellProtocol?
var index: IndexPath?

2 - затем добавьте это в делегат:

func onStepperClick(index: Int, sender: UIStepper)

3 - когда вы перетащили свой степпер в качестве действия, используйте это:

@IBAction func cellStepper(_ sender: UIStepper) {
    cellDelegate?.onStepperClick(index: (index?.row)!, sender: sender)
    sender.maximumValue = 1  //for incrementing
    sender.minimumValue = -1 //for decrementing
    //this will make sense later
}

В ViewController

1 — добавьте их в функцию tableView, которая имеет переменную cellAtRow.

cell.cellDelegate = self
cell.index = indexPath 

2 - Используйте это вместо вашей функции stepperButton

func onStepperClick(index: Int, sender: UIStepper) {
    print(index)

    if sender.value == 1.0{
        //positive side of stepper was pressed
    }else if sender.value == -1.0{
        //negative side of stepper was pressed
    }

    sender.value = 0  //resetting to zero so sender.value produce different values on plus and minus

}

Надеюсь, что это работает для вас

person Haider Malik    schedule 03.09.2018

ПРИМЕЧАНИЕ. 1. Класс MY Cell просто нормальный. Все изменения в классе контроллера представления. 2. Я взял степпер и поверх него добавил ibAddButton с тем же ограничением, что и ibStepper.

class cell: UITableViewCell {

    @IBOutlet weak var ibAddButton: UIButton!
    @IBOutlet weak var ibStepper: UIStepper!
    @IBOutlet weak var ibCount: UILabel!
    @IBOutlet weak var ibLbl: UILabel!
}

1. определить пустой массив целых чисел [Int]()

переменная countArray = [Int]()

2.добавьте countArray со всеми нулями с количеством данных, которые вы хотите заполнить в табличном представлении.

 for arr in self.responseArray{
        self.countArray.append(0)
   }

3.в ячейке для строки в

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

         let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! cell
         let dict = responseArray[indexPath.row] as? NSDictionary ?? NSDictionary()
         cell.ibLbl.text = dict["name"] as? String ?? String()
         if countArray[indexPath.row] == 0{
             cell.ibAddButton.tag = indexPath.row
             cell.ibStepper.isHidden = true
             cell.ibAddButton.isHidden = false
             cell.ibCount.isHidden = true
             cell.ibAddButton.addTarget(self, action: #selector(addPressed(sender:)), for: .touchUpInside)
         }else{
             cell.ibAddButton.isHidden = true
             cell.ibStepper.isHidden = false
             cell.ibStepper.tag = indexPath.row
             cell.ibCount.isHidden = false
             cell.ibCount.text = "\(countArray[indexPath.row])"
             cell.ibStepper.addTarget(self, action: #selector(stepperValueChanged(sender:)), for: .valueChanged)}
    return cell
     }

4.объектные функции

 @objc func stepperValueChanged(sender : UIStepper){
     if sender.stepValue != 0{
         countArray[sender.tag] = Int(sender.value)
     }
     ibTableView.reloadData()
 }
 @objc func addPressed(sender : UIButton){

     countArray[sender.tag] = 1//countArray[sender.tag] + 1
     ibTableView.reloadData()
 }
person suraj jadhav    schedule 13.11.2019