SwiftUI Использование ObservableObject в представлении на новом листе - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь выяснить, как использовать значение, присвоенное переменной в классе ObservableObject, в другом представлении на другом листе. Я вижу, что он обновляется, но когда я обращаюсь к нему в новом представлении на новом листе, он сбрасывается до инициализированного значения. Как получить его, чтобы сохранить новое значение, чтобы я мог использовать его в новом представлении на новом листе?

ContentData.swift

import SwiftUI
import Combine

class ContentData: ObservableObject {
    @Published var text: String = "Yes"
}

ContentView.swift

import SwiftUI

struct ContentView: View {
    @ObservedObject var contentData = ContentData()
    @State private var inputText: String = ""
    @State private var showNewView: Bool = false

    var body: some View {
        VStack {
            TextField("Text", text: $inputText, onCommit: {
                self.assignText()
            })
            Button(action: {
                self.showNewView = true
            }) {
                Text("Go To New View")
            }
            .sheet(isPresented: $showNewView) {
                NewView(contentData: ContentData())
            }
        }
    }
    func assignText() {
        print(contentData.text)
        contentData.text = inputText
        print(contentData.text)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(contentData: ContentData())
    }
}

NewView.swift

import SwiftUI

struct NewView: View {
    @ObservedObject var contentData = ContentData()

    var body: some View {
        VStack {
            Text(contentData.text)
        }
    }
}

struct NewView_Previews: PreviewProvider {
    static var previews: some View {
        NewView(contentData: ContentData())
    }
}

Я пробовал много, много разных методов, которые я видел из других примеров. Я попытался сделать это с @EnviromentObject, но не смог заставить это работать. Я также попробовал другую версию NewView.swift, где я инициализировал значение с помощью:

    init(contentData: ContentData) {
        self.contentData = contentData
        self._newText = State<String>(initialValue: contentData.text)
    }

Я думаю, что я близок, но я не вижу, что мне не хватает. Любая помощь будет очень высоко ценится. Спасибо.

1 Ответ

1 голос
/ 26 апреля 2020
 @ObservedObject var contentData = ContentData()

ContentData() в приведенной выше строке создает новый экземпляр класса ContentData.

Вы должны передать тот же экземпляр из ContentView в NewView, чтобы сохранить значения. Например,

.sheet(isPresented: $showNewView) {
                NewView(contentData: self.contentData)
            }

Прекратите создавать новый экземпляр ContentData в NewView и добавьте возможность вводить ContentData извне

    struct NewView: View {

        @ObservedObject var contentData: ContentData

        ...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...