在 SwiftUI 中使用可观察对象切换视图

Posted

技术标签:

【中文标题】在 SwiftUI 中使用可观察对象切换视图【英文标题】:Switching Views With Observable Objects in SwiftUI 【发布时间】:2020-03-13 07:44:17 【问题描述】:

我正在练习尝试,但我的代码无法正常工作。我知道我可以用@State 做到这一点,但我想让它与可观察对象一起工作。当我在内容视图中单击图像时,图像不会改变。有人可以帮我吗?

ContentView.swift

import SwiftUI

struct ContentView: View 

    @ObservedObject var viewRouter: ViewRouter


    var body: some View 

        VStack 

            Button(action: self.viewRouter.currentPage = "Page2") 
                Image(viewRouter.currentPage)
            

            if viewRouter.currentPage == "Page1" 
                Page1(viewRouter: viewRouter)

            else if viewRouter.currentPage == "Page2" 
                Page2(viewRouter: viewRouter)
            
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView(viewRouter: ViewRouter())
    
  

ViewRouter.swift

import Foundation
import SwiftUI
import Combine

class ViewRouter: ObservableObject 

    let objectWillChange = PassthroughSubject<ViewRouter, Never>()

   @Published var currentPage: String = "Page1"

  

Page1.swift

import SwiftUI

struct Page1: View 

    @ObservedObject var viewRouter:ViewRouter

    var body: some View 
        VStack 
         Image("ET-LondonBridge")
        
    


struct Page1_Previews: PreviewProvider 
    static var previews: some View 
        Page1(viewRouter: ViewRouter())
    

Page2.swift

import SwiftUI

struct Page2: View 

    @ObservedObject var viewRouter:ViewRouter

    var body: some View 
        VStack 
            Image("BigBen")
                .aspectRatio(contentMode: .fit)
        
    


struct Page2_Previews: PreviewProvider 
    static var previews: some View 
        Page2(viewRouter: ViewRouter())
    

【问题讨论】:

【参考方案1】:

您不需要这条线来使所有事情都正常工作。注释掉这一行

//let objectWillChange = PassthroughSubject<ViewRouter, Never>()

【讨论】:

以上是关于在 SwiftUI 中使用可观察对象切换视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将可观察对象发布的整数变量绑定到 SwiftUI 中的 textField?

如何在 SwiftUI 中使用可观察对象并与 NavigationLink 绑定?

声明后不可访问的可观察对象中的变量(SwiftUI)

观察到的对象无意中被解雇 SwiftUI

SwiftUI 从另一个视图更改观察到的对象

SwiftUI 可观察对象返回陈旧数据