Как получить доступ к свойству подкласса UIView в представлении SwiftUI? - PullRequest
1 голос
/ 21 июня 2019

Я сделал простое приложение. Я сделал подкласс UIView, который представляет UIButton. Всякий раз, когда я нажимаю кнопку, значение свойства «число» увеличивается на 1. Я интегрировал этот пользовательский UIView в представление SwiftUI с помощью протокола UIViewRepresentable. Как получить доступ к свойству «number» в представлении 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 Ответ

1 голос
/ 21 июня 2019

Я бы рекомендовал использовать 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)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...