繁体   English   中英

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

[英]How can I access a property of a subclass of UIView in a SwiftUI View?

我做了一个简单的应用。 我做了一个 UIView 的子类,它呈现了一个 UIButton。 每当我点击按钮时,“number”属性的值都会增加 1。我在 UIViewRepresentable 协议的帮助下将此自定义 UIView 集成到 SwiftUI 视图中。 如何访问 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)
        }
    }
}

我建议在您的自定义视图中使用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)
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM