Как создать изменяемые строки в текстовых элементах SwiftUI? - PullRequest
1 голос
/ 12 января 2020

Я хотел бы отобразить текст (представление) в SwiftUI, который имеет изменяемое содержимое строки.

@State var myvar : String = "Undefined"
var body: some view {
Text("Content: \(myvar)")
}

func abc() {
self.myvar = "Defined"
}

Всякий раз, когда я вызываю функцию ab c (), значение myvar не получить обновление. Я проверил это с помощью debugPrint (self.myvar) в ab c ().

Этот код находится внутри моего ContentView.swift, в то время как я вызываю contentView.ab c () из HostingController.swift в методе обратного вызова делегата.

Есть ли решение для создания изменяемого / changeable Строки для этого «внешнего» использования в SwiftUI?

РЕДАКТИРОВАТЬ:

Из HostingController:

override var body: ContentView {
let contentView = ContentView().environmentObject(contentModel)
...
return contentView 

В последней строке выдается ошибка «Не удается преобразовать возвращаемое выражение введите некоторый вид, чтобы вернуть тип ContentView´. Следует отметить, что я работаю в контексте WatchKit, так что это приложение Apple Watch.

1 Ответ

1 голос
/ 12 января 2020

Это можно сделать с помощью environmentObject

Создать класс модели представления для хранения myvar состояние

class ViewModel: ObservableObject {
    @Published var myvar: String = "Undefined"
}

Объявить его как член SceneDelegate

let contentModel = ViewModel()

Передайте его в представление содержимого перед добавлением на контроллер хоста

let contentView = ContentView().environmentObject(contentModel)

Изменение в другом делегате сцены (или другом месте, переданном по ссылке)

self.contentModel.myvar = "Defined"

Использование в ContentView

struct ContentView: View {
    @EnvironmentObject var viewModel: ViewModel

    var body: some view {
        Text("Content: \(viewModel.myvar)")
    }
    ...
...