我做了一个简单的申请。我做了一个呈现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)
}
}
}
答案 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)
}
}
}