如何在SwiftUI中删除标有@ObjectBinding的对象?

时间:2019-07-12 09:38:18

标签: swift swiftui

我想删除标记为@ObjectBinding的对象,例如清理某些TextFields

我尝试将对象引用设置为nil,但是它不起作用。

import SwiftUI
import Combine

class A: BindableObject {
    var didChange = PassthroughSubject<Void, Never>()

    var text = "" { didSet { didChange.send() } }
}

class B {
    var property = "asdf"
}

struct DetailView : View {
    @ObjectBinding var myObject: A = A()    //@ObjectBinding var myObject: A? = A() -> Gives an error.
    @State var mySecondObject: B? = B()

    var body: some View {

        VStack {
            TextField($myObject.text, placeholder: Text("Enter some text"))
            Button(action: {
                self.test()
            }) {
                Text("Clean up")
            }
        }
    }

    func test() {
        //myObject = nil
        mySecondObject = nil
    }
}

如果我尝试对@ObjectBinding使用可选内容,则会收到错误消息

  

“无法将类型'ObjectBinding'的值转换为指定的类型   “ A?”。

它仅适用于@State

致谢

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

class A: BindableObject {
    var didChange = PassthroughSubject<Void, Never>()

    var form = FormData() { didSet { didChange.send() } }

    struct FormData {
        var firstname = ""
        var lastname  = ""
    }

    func cleanup() {
        form = FormData()
    }
}

struct DetailView : View {
    @ObjectBinding var myObject: A = A()

    var body: some View {

        VStack {
            TextField($myObject.form.firstname, placeholder: Text("Enter firstname"))
            TextField($myObject.form.lastname, placeholder: Text("Enter lastname"))
            Button(action: {
                self.myObject.cleanup()
            }) {
                Text("Clean up")
            }
        }
    }
}

答案 1 :(得分:0)

我绝对同意@kontiki,但是您应该记住不要在变量可以移出时使用@State。 @ObjectBinding在这种情况下正确的方式。同样,如果需要,所有新的内存管理方式都已经包括了可选的(弱)。

选中this以获取有关SwiftUI中的内存管理的更多信息

那是如何使用@ObjectBinding

struct DetailView : View {
    @ObjectBinding var myObject: A 

DetailView(myObject: A())