如何在SwiftUI视图中访问UIView子类的属性?

时间:2019-06-20 21:10:33

标签: swift uikit swiftui

我做了一个简单的申请。我做了一个呈现UIButton的UIView的子类。每当我点击按钮时,“ number”属性的值就会增加1。我借助UIViewRepresentable协议将此自定义UIView集成到了SwiftUI View中。如何在SwiftUI视图中访问“数字”属性?

import UIKit

class CustomUIView: UIView {
    var number = 0

    override init(frame:CGRect) {
        super.init(frame: frame)
        createButton()
    }

    required init?(coder: NSCoder) {
        fatalError("error")
    }

    private func createButton () {
        let button = UIButton();
        button.setTitle("Add", for: .normal)
        button.setTitleColor(UIColor.blue, for: .normal)
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
        self.addSubview(button)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
        button.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    }

    @objc func buttonTapped(sender: UIButton) {
        number += 1
        print(number)
    }
}
import SwiftUI

struct CustomButton: UIViewRepresentable {
    func makeUIView(context: Context) -> CustomUIView {
        let customButton = CustomUIView()
        return customButton
    }

    func updateUIView(_ view: CustomUIView, context: Context) {

    }
}

struct ContentView : View {
    var body: some View {
        NavigationView {
            Text("I want to show here the value of the number property")
            CustomButton().frame(height: 50)
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我建议您在自定义视图中使用Binding,以便SwiftUI视图仍然是价值真理的源泉。

class CustomUIView: UIView {
    var number: Binding<Int>!

    override init(frame:CGRect) {
        super.init(frame: frame)
        createButton()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        createButton()
    }

    private func createButton () {
        let button = UIButton();
        button.setTitle("Add", for: .normal)
        button.setTitleColor(UIColor.blue, for: .normal)
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
        self.addSubview(button)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
        button.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    }

    @objc func buttonTapped(sender: UIButton) {
         number.value += 1
    }
}
struct CustomButton: UIViewRepresentable {
    var binding: Binding<Int>

    init(number: Binding<Int>) {
        self.binding = number
    }
    func makeUIView(context: Context) -> CustomUIView {
        let customButton = CustomUIView()
        customButton.number = binding
        return customButton
    }

    func updateUIView(_ view: CustomUIView, context: Context) {

    }
}

struct ContentView : View {
    @State var number = 0

    var body: some View {
        NavigationView {
            Text("I want to show here the value of the number property")
            .lineLimit(nil)
            Text("Current value: \(number)")
            CustomButton(number: $number).frame(height: 50)
        }
    }
}