問題タブ [environmentobject]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mvvm - EnvironmentObject ビュー モデル内のタイマーがビューを更新しない
複数の子ビュー モデルを持つビュー モデルがあります。私はwatchOS、SwiftUI、およびCombineにかなり慣れていません-この機会に学びましょう。
私はそれがあるwatchUIを持っています
- 再生ボタン (ビュー) -
SetTimerPlayPauseButton
- 時刻を表示するテキスト (ビュー) -
TimerText
- ビュー モデル - 1
WatchDayProgramViewModel
- N:ExerciseTestClass
- N:を持つSetInformationTestClass
。各エクササイズ セットには があり、watchTimer & watchTimerSubscription
残りの休憩時間を更新するためにタイマーを実行することができました。 - ContentView - ViewModel として注入されたもの
EnvironmentObject
タップSetTimerPlayPauseButton
してタイマーを開始すると、タイマーが実行され、動作し、remainingRestTime(子ビュー モデル内のプロパティSetInformationTestClass
) が正しく変更されますが、更新/変更はTimerText
Viewに「公開」されません。
すべてではないにしても、ほとんどの推奨事項を他のSOの回答で行いましたWatchDayProgramViewModel
ExerciseTestClass
SetInformationTestClass
@Published
.
私のコードを見直して、それを改善する方法についてアドバイスをください。
コンテンツ ビュー
SetRestDetailView
タイマーテキスト
ビューモデル
json - SwiftUI - リモート JSON データのデータを取得して、アプリの起動時に更新します
私は初心者です(そして、私のコード/モデルは現在それを表示するので、私に気楽に行ってください!)。
レシピ スタイル (cenotes) アプリの作成に初めて取り組んでいます。
データを更新できるように、リモート json ファイルがあるため、ユーザーは更新されたデータを取得するために再インストールする必要がありません。
アプリはデータを正常に取得して解析します (これは成功です!)が、最初にインストールしたときのみです。
その後、オンラインで変更されたデータは更新されません。.onAppear と .refreshable を使用してみましたが失敗しました。更新されたデータを取得するには、アプリを削除して再インストールする必要があります。
以下は、私のファイルの編集済みバージョンの一部です。@StateObject/@EnvironmentObject または同様のものが間違っていると思いますが、エラーを見つけることはできません。
Locations.swift
Location.swift - VM
App.swift - アプリはこのタブ ビューで開きます
ListView.swift - 最初に選択されたタブはこのビューです - これらの場所は最初のインストール後に更新されません:
swiftui - SwiftUI View init()で「environmentObject」に依存する「var」を初期化する方法は?
ビューの関数内の@EnvironmentObject
(またはその他の)に依存するいくつかの内部変数を初期化するより自然な方法 (現在は 2022 年) はありますか?@ObservedObject
init()
たとえば、次の図は、私がやろうとしていること (コメント アウト) と機能することを示しています。残念ながら、「機能する」コードはかなり扱いにくい (かさばる、反復的) です。単にdiary
var を使用する代わりに、コードを振りかけるtry? log.readDiary(for: state.now)
か、すべてをサブビューでラップする必要があります。ベストプラクティスとは何かを考えています。
ここに関連する投稿があります: Swiftui - How do I initialize an observedObject using an environmentobject as a parameter? 、しかし、単純な初期化のように見えるものを達成するために内部サブビューを作成したくありません。それはただ...無駄で、繰り返しが多く、扱いにくいようです。それ以来、API が少し進化していることを願っています。