【问题标题】:How can I access a property of a subclass of UIView in a SwiftUI View?如何在 SwiftUI 视图中访问 UIView 子类的属性?
【发布时间】:2019-06-20 21:10:33
【问题描述】:

我做了一个简单的应用程序。我创建了一个 UIView 的子类,它提供了一个 UIButton。每当我点击按钮时,“数字”属性的值都会增加 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)
        }
    }
}

【问题讨论】:

    标签: swift uikit swiftui


    【解决方案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)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      相关资源
      最近更新 更多