Swift 如何";通行证;从自定义单元格类到viewController的信息?

Swift 如何";通行证;从自定义单元格类到viewController的信息?,swift,uitableview,Swift,Uitableview,我有一个自定义单元格类,其中包含一个滑块,我想用它保存一个整数值(存储为字符串)。滑块的值将保存到自定义单元格中的全局变量中,viewController中的保存函数将保存该值。但是,它不会保存更新后的值。(我认识到保存到全局变量,然后在另一个视图中使用该全局变量不是一个好主意,但我不知道如何传递信息……我在其他场景中使用了prepareForSegue,但这里没有分段……滑块在viewController的单元格中)。代码如下: var moneyValue: Int = Int() var

我有一个自定义单元格类,其中包含一个滑块,我想用它保存一个整数值(存储为字符串)。滑块的值将保存到自定义单元格中的全局变量中,viewController中的保存函数将保存该值。但是,它不会保存更新后的值。(我认识到保存到全局变量,然后在另一个视图中使用该全局变量不是一个好主意,但我不知道如何传递信息……我在其他场景中使用了
prepareForSegue
,但这里没有分段……滑块在viewController的单元格中)。代码如下:

var moneyValue: Int = Int()
var moneyAmount: String = String()
class CustomCell: UITableViewCell, UITextFieldDelegate {
@IBOutlet weak var moneySlider: UISlider!
    @IBAction func sliderValueChanged(_ sender: UISlider) {
        moneyValue = Int(sender.value)
        moneyLabel.text = String(moneyValue)
        moneyAmount = moneyLabel.text!
    }
}//there is an initializer (not posted) that sets the original value to 0
以下是viewController的总体代码:

class CreateVC: UIViewController, UITableViewDelegate, UITableViewDataSource, CustomCellDelegate, UITextFieldDelegate, UITextViewDelegate { 
            @IBAction func saveButtonTapped(_ sender: UIBarButtonItem) {
                //save moneyAmount to DB
            }
}

保存到DB非常简单,但是无论滑块的位置如何,值“0”始终是保存的值。“0”是滑块的初始位置,因此我认为问题在于滑块的更新值没有以某种方式保存到变量中。1.如何修复此问题和/或2。如果当前设置不理想,那么传递此信息的适当方式是什么?

根据评论,我已经编辑了此答案

在cell.swift中定义协议

protocol CellDelegate : class
{
    func cellDelegate(moneyValue: Int) -> Void
}
extension CellDelegate
{
    func cellDelegate(moneyValue: Int) -> Void {}
}

class CustomCell: UITableViewCell, UITextFieldDelegate
{
    weak var delegate: CellDelegate?

    var moneyValue: Int = Int()
    var moneyAmount: String = String()
    @IBOutlet weak var moneySlider: UISlider!
    @IBAction func sliderValueChanged(_ sender: UISlider)
    {
        moneyValue = Int(sender.value)
        moneyLabel.text = String(moneyValue)
        moneyAmount = moneyLabel.text!

        if delegate != nil {
            delegate?.cellDelegate(moneyValue: moneyValue)
        }
    }
}
然后,在viewcontroller.swift中实现该协议。该值将从单元格传递到视图控制器

class CreateVC: UIViewController, CellDelegate
{
    func cellDelegate(moneyValue: Int)
    {
        ...
    }
}
如果要在多个
UIViewController
中使用自定义单元格,则上述方法将失败。然后按以下步骤操作:

  • 使用委托和协议

  • 闭包(块回调)


  • 这是一个问题,不是答案。一旦你赢得了足够的声誉,你可以发表评论,但在此之前,请不要发表评论作为回答。删除或编辑它,使其成为实际答案。一个好的答案不仅仅是一个简单的句子。清楚地解释如何实施你的建议。@rmaddy这不是他的错,发布评论需要更多的代表性而不是答案(为什么?!)。这不是“正确的”,但这是网站规则的紧急行为。既然你已经发布了答案,请记住这里不赞成只使用代码的答案。最好先解释解决方案,然后用代码备份描述。如果答案在适当的时候解释问题中的代码有什么问题也是最好的。我尝试了这个方法,但我没有看到在ViewController中调用方法cellDelegate(moneyValue:Int),那么我是否应该在view controller中从它取值?我理解这个概念,但是我不能在自定义单元格类中使用save按钮,因为它还可以处理视图中其他值的很多事情,因此在自定义单元格类中使用它会使它变得非常复杂。好的,没问题,我以为您有save按钮。根据您的问题,现在使用以下选项,因为我提供的链接使委托或闭包与您的代码兼容。您知道,单元格中的组件对象总是在“cellForRow”方法或customCell方法中获得。如果您使用“cellForRow”方法编写代码,它会增加单个方法中的代码长度,并且当您希望对其他VC使用相同的customCell时,您必须再次执行相同的代码,因此take callback是解决问题的最佳方法。
                class CustomCell: UITableViewCell, UITextFieldDelegate {
    
                var moneyValue: Int = Int()
                var moneyAmount: String = String()
    
                @IBOutlet weak var moneySlider: UISlider!
                    @IBAction func sliderValueChanged(_ sender: UISlider) {
                        moneyValue = Int(sender.value)
                        moneyLabel.text = String(moneyValue)
                        moneyAmount = moneyLabel.text!
                    }
    
    // create action of 'button save' in your custom cell, whenever you clicked on button you get all the values of components here and save your values in your DB
    // Now, you don't need to declare global variables,
    
                @IBAction func saveButtonTapped(_ sender: UIBarButtonItem) {
                            //save moneyAmount to DB
                        }
            }