Merhabalar bu yazımda SwiftUI ile @EnvironmentObject kullanımından bahsedeceğim.
Daha önceki yazımda bahsettiğim @ObservedObject yazısının devamı şekilinde düşünebilirsiniz. iOS ile uygulamalarımızda splash ekran içerisinde bazen Singleton yapıda sınıflar yazarak kullanıcının bazı bilgilerini uygulama boyunca hafızada tutması için yazarız. Buda bize tekrarlı servis istekleri kullanmaktan kurtarır.
Bu işlemi SwiftUI ile birlikte Viewler arası yapmak istediğinizde @EnvironmentObject kullanmamız gerekir. Bu işlem için uygulama SceneDelegate içerisinde yazdığımız shared sınıfı eklememiz gerekir.
Aşağıda yazdığım örneği inceleyerek devam edelim.
İlk önce basit bir model oluşturalım.
struct User { var isAuth:Bool = false } class UserViewModel: ObservableObject { @Published var user = User() func loginUser() { user.isAuth = true } func logout() { user.isAuth = false } }
Daha sonrasında yazdığımız sınıfı SceneDelegate içerisinde ilgili View’e eklemeniz gerekir.
class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { if let windowScene = scene as? UIWindowScene { let window = UIWindow(windowScene: windowScene) window.rootViewController = UIHostingController(rootView: ContentView().environmentObject(UserViewModel())) self.window = window window.makeKeyAndVisible() } } }
Bu işlemi gerçekleştirdikten sonra View içerisinde nesnemize kullanalım.
struct ContentView:View { @State var isPresent:Bool = false @EnvironmentObject var model:UserViewModel var body: some View { VStack { Button(action: { self.isPresent.toggle() }) { Text("Show Menu") }.sheet(isPresented: $isPresent, content: { LoginView().environmentObject(self.model) }).padding(EdgeInsets(top: 0, leading: 0, bottom: 20, trailing: 0)) Text("User Auth - \(self.model.user.isAuth ? "TRUE" : "FALSE")") .font(.subheadline) } } }
Burada yazdığım örnekte ContentView sayfasında kullanıcının giriş yapıp, yapmadığını kontrol ediyoruz. Bunun için diğer bir sayfaya present olup, UserViewModel üzerinde değişiklik yapacağız.
struct LoginView:View { @Environment(\.presentationMode) var presentation @EnvironmentObject var model:UserViewModel var body: some View { VStack { Button(action: { self.model.loginUser() self.presentation.wrappedValue.dismiss() }) { Text("Login") }.padding(EdgeInsets(top: 0, leading: 0, bottom: 20, trailing: 0)) Button(action: { self.model.logout() self.presentation.wrappedValue.dismiss() }) { Text("Logout") } } } }
@EnvironmentObject nesnesi üzerinde yapılacak tüm değişiklikler diğer sayfalardan dinlenip, kullanılabilinir.
İlk Yorumu Siz Yapın