Swift 自定义回调在第一个实例上不起作用,但在第二个实例上起作用

Swift custom callback is not working on first instance but working on second instance

提问人:Rahul Vyas 提问时间:3/30/2023 最后编辑:Rahul Vyas 更新时间:3/30/2023 访问量:49

问:

我有以下自定义UIStackViewComponent

class TitleWithSwitchView: UIStackView {
    let title: String
    var onSwitchTapped: ((Bool) -> Void)?
    override init(frame: CGRect) {
        self.title = ""
        super.init(frame: frame)
    }
    
    required init(coder: NSCoder) {
        self.title = ""
        super.init(coder: coder)
    }
    
    init(title: String) {
        self.title = title
        super.init(frame: .zero)
        setupUI()
        setupConstraints()
    }
    
    private var label: UILabel {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.textColor = .white
        label.numberOfLines = 0
        label.lineBreakMode = .byWordWrapping
        label.text = "-"
        return label
    }
    
    private lazy var labelTitle = {
        let label = label
        label.text = title
        return label
    }()
    
    private lazy var switchButton = {
        let switchButton = UISwitch()
        switchButton.translatesAutoresizingMaskIntoConstraints = false
        switchButton.addTarget(self, action: #selector(switchTapped), for: .valueChanged)
        return switchButton
    }()
    
    @objc private func switchTapped() {
        onSwitchTapped?(switchButton.isOn)
    }
}

我有 2 个相同组件的实例,开关仅在第二个实例上工作。在一审中,什么也没发生

更新:

这就是我使用这个组件的方式。第二个工作得很好,但第一个不起作用

    private lazy var stackViewHobbyContainer = {
            let stack = TitleWithSwitchView(title: "Some Text")
            stack.onSwitchTapped = { [weak self] isOn in
                self?.onHobbyContainerSwitchChange(isOn: isOn)
            }
            return stack
        }()

private lazy var stackViewChallengeSwitchView = {
        let stack = TitleWithSwitchView(title: "Another Text?")
        stack.onSwitchTapped = { [weak self] isOn in
            print("Switch tapped \(isOn)")
        }
        return stack
    }()
iOS Swift 回调 UIswitching

评论

0赞 Dogan Altinbas 3/30/2023
在提供的代码中,每次访问 label computed 属性时都会创建一个新属性,当此类有多个实例时,这可能会导致问题。若要解决此问题,可以尝试使用延迟初始化创建和存储属性。UILabellabelTitleswitchButton
0赞 Rahul Vyas 3/30/2023
你能更新代码吗?
0赞 Geoff Hackworth 3/30/2023
我要检查的第一件事是是否通过添加或使用断点为两个开关调用操作处理程序。如果那被调用,是以某种方式.测试逻辑以尝试找出失败的地方。在闭包的实现中添加打印点或断点。这将有助于诊断出了什么问题。switchTappedprintonSwitchTappednilstackViewHobbyContainer
0赞 Rahul Vyas 3/30/2023
当我诊断它时,我发现没有调用开关事件来更改值。

答: 暂无答案