簡體   English   中英

使用 EnvironmentObject(按鈕和導航視圖)切換視圖不起作用

[英]Switching Views using EnvironmentObject (Button and Navigation View) not working

我想做什么?

我構建了一個應用程序,您可以在其中查看不同的講座。 您應該從導航視圖中選擇一個講座,然后單擊開始講座並繼續閱讀。

應用程序是如何建立的?

第 0 頁: MainMenuView - 顯示 5 個項目的 NavigationView(講座)

 // // MainMenuView.swift // NewCareerFriends // // Created by Tobias Reidl on 20.09.20. // Copyright © 2020 Tobias Reidl. All rights reserved. // import SwiftUI struct MainMenuView: View { @State private var model = Topic.all() @EnvironmentObject var viewRouter: ViewRouter var body: some View { ZStack { //Background Rectangle() .edgesIgnoringSafeArea(.all) .foregroundColor(Color(.white)) VStack { //Logo at the Top Image("careerfriends_logo_transparent") .resizable() .scaledToFit() .padding() .background(Color("card2")) .cornerRadius(10) .padding() .clipped() .shadow(color: Color.black.opacity(0.3), radius: 10, x: 0, y: 0) //Lectures as a Navigation View NavigationView{ List { ForEach(model) { topic in TopicCell(topic: topic) } } .navigationBarTitle(Text("Lektionen")) } .cornerRadius(20) .padding() .shadow(radius: 10) } } } // Custom Navigation View Design init() { // 1. UINavigationBar.appearance().backgroundColor = .white // 2. UINavigationBar.appearance().largeTitleTextAttributes = [ .foregroundColor: UIColor.black, .font : UIFont(name:"Arial", size: 28)!] // 3. UINavigationBar.appearance().titleTextAttributes = [ .font : UIFont(name: "Arial", size: 20)!] } } // Previewer struct MainMenuView_Previews: PreviewProvider { static var previews: some View { MainMenuView() } } // Custom Cells for the NavigationView struct TopicCell: View { let topic : Topic var body: some View { // Below is the error message return NavigationLink(destination: LectureFullView(topic: topic).environmentObject(ViewRouter())){ HStack{ Image(topic.Image) .resizable() .scaledToFit() .frame(width: 150, height: 160) .cornerRadius(10) VStack{ Text(topic.Title) .font(.headline) .frame(maxWidth: .infinity, alignment: .leading) Text(topic.Text) .lineLimit(7) .font(.system(size: 14)) .frame(maxWidth: .infinity, alignment: .center) } } } } }

第 1 頁: LectureFullView - 顯示快速項目(講座)介紹,“開始講座”按鈕

 // // LectureFullView.swift // NewCareerFriends // // Created by Tobias Reidl on 23.09.20. // Copyright © 2020 Tobias Reidl. All rights reserved. // import SwiftUI struct LectureFullView: View { let topic : Topic @EnvironmentObject var viewRouter: ViewRouter var body: some View { ZStack { ScrollView{ VStack{ Image(topic.Image) .resizable() .scaledToFit() .edgesIgnoringSafeArea(.all) Text(topic.Title) .font(.system(size: 32)) .frame(maxWidth: .infinity, alignment: .center) Text(topic.Text) .font(.system(size: 17)) .frame(maxWidth: .infinity, alignment: .center) .padding(.leading) .padding(.trailing) .padding(.bottom) } VStack{ Button(action: { self.viewRouter.currentPage = "page2" }) { Text("Lektion starten") .font(.body) } } .padding(.bottom) } } } } struct LectureFullView_Previews: PreviewProvider { static var previews: some View { LectureFullView(topic: Topic.all()[0]).environmentObject(ViewRouter()) } }

第 2 頁: LevelOneView - 展示講座的第一部分

 // // LevelOneView.swift // NewCareerFriends // // Created by Tobias Reidl on 27.09.20. // Copyright © 2020 Tobias Reidl. All rights reserved. // import SwiftUI struct LevelOneView: View { let topic: Topic @EnvironmentObject var viewRouter: ViewRouter var body: some View { ZStack{ VStack{ HStack{ Button(action: { // }) { Text("Zurück") .font(.headline) .padding() .background(Color(.white)) .cornerRadius(10) .clipped() .shadow(color: Color.black.opacity(0.3), radius: 10, x: 0, y: 0) } Text("Teil 1") .font(.largeTitle) .padding() .background(Color(.white)) .cornerRadius(10) .clipped() .shadow(color: Color.black.opacity(0.3), radius: 10, x: 0, y: 0) Button(action: { self.viewRouter.currentPage = "Page1" }) { Text("Weiter") .font(.headline) .padding() .background(Color(.white)) .cornerRadius(10) .clipped() .shadow(color: Color.black.opacity(0.3), radius: 10, x: 0, y: 0) } } Spacer() InformationView(topic: topic) Spacer() Image("BannerWindow1") .resizable() .cornerRadius(10) .scaledToFit() .padding() .shadow(radius: 10) } } } } struct LevelOneView_Previews: PreviewProvider { static var previews: some View { LevelOneView(topic: Topic.all()[0]).environmentObject(ViewRouter()) } } struct InformationView: View { let topic : Topic var body: some View { ScrollView { Text(topic.Information01) Spacer() } .padding() .background(Color(.white)) .cornerRadius(10) .padding(.leading) .padding(.trailing) .clipped() .shadow(color: Color.black.opacity(0.3), radius: 10, x: 0, y: 0) } }

附加: LectureMotherView - 控制要顯示的視圖

 // // LectureMotherView.swift // NewCareerFriends // // Created by Tobias Reidl on 27.09.20. // Copyright © 2020 Tobias Reidl. All rights reserved. // import SwiftUI struct LectureMotherView: View { // @State var page: String = "page0" @EnvironmentObject var viewRouter: ViewRouter var body: some View { VStack{ if viewRouter.currentPage == "page1" { LectureFullView(topic: Topic.all()[0]) } else if viewRouter.currentPage == "page2" { LevelOneView(topic: Topic.all()[0]) } else if viewRouter.currentPage == "page0" { MainMenuView() } } } } struct LectureMotherView_Previews: PreviewProvider { static var previews: some View { LectureMotherView().environmentObject(ViewRouter()) } }

附加: ViewRouter - 跟蹤頁面 0 到 2 上的更改

 // // LectureMotherView.swift // NewCareerFriends // // Created by Tobias Reidl on 27.09.20. // Copyright © 2020 Tobias Reidl. All rights reserved. // import SwiftUI struct LectureMotherView: View { // @State var page: String = "page0" @EnvironmentObject var viewRouter: ViewRouter var body: some View { VStack{ if viewRouter.currentPage == "page1" { LectureFullView(topic: Topic.all()[0]) } else if viewRouter.currentPage == "page2" { LevelOneView(topic: Topic.all()[0]) } else if viewRouter.currentPage == "page0" { MainMenuView() } } } } struct LectureMotherView_Previews: PreviewProvider { static var previews: some View { LectureMotherView().environmentObject(ViewRouter()) } }

附加:主題 - 存儲數據

 // // TopicModel.swift // NewCareerFriends // // Created by Tobias Reidl on 23.09.20. // Copyright © 2020 Tobias Reidl. All rights reserved. // import Foundation import SwiftUI struct Topic: Identifiable { let id = UUID() let Title: String let Image: String let Text: String let Information01: String let Question: String } extension Topic { static func all() -> [Topic] { return [ Topic(Title: "Job finden", Image: "Window1", Text: "Nach drei Semestern studieren sucht Tim nach einer Möglichkeit erste, fachliche Berufserfahrung zu sammeln. Hierzu macht er sich auf die Suche nach einem Job den er neben dem Studium ausüben kann. In dieser Lektion lernst du die grundlegenden Information um einen studentischen Job zu finden.", Information01: "Die Online Jobbörse ist der bekannteste Ort zum Jobs finden, allerdings gibt es oftmals andere und teilweise sogar effektivere Methoden. Über Bekannte oder Mitstudenten herauszufinden in welchem Unternehmen sie vielleicht sogar aktuell als Student tätig sind gibt dir ggf. die Möglichkeit viel vom Standard Bewerbungsprozess zu überspringen und direkt durch Empfehlung bevorzugt zu werden. Dies ist dann besonders ein Vorteil wenn du bisher noch nicht so viele Erfahrungen hast. Wenn dein Lebenslauf nicht unbedingt Bände spricht macht eine Empfehlung von einem Mitstudenten schon einiges aus, solange er natürlich selbst gute Arbeit leistet. ", Question: "Hallo"), Topic(Title: "Bewerben", Image: "Window2", Text: "Nachdem du einen interessanten Job gefunden hast geht es ans bewerben. Doch wie genau bewirbt man sich richtig als Student? Was ist gern gesehen und was verrufen? Sich bewerben ist ein bisschen wie Dating. Du möchtest der anderen Person deinen Wert zeigen, bzw. auf deine Attraktivität als Mitarbeiter aufmerksam machen. Je mehr du mit der anderen Person gemeinsam hast und je eher ihr von euren Werten und Einstellungen zueinander passt, desto wahrscheinlicher findet ihr euch interessant. Das Bewerbungsschreiben und das Vorstellungsgespräch sind sich im Grunde sehr ähnlich. Die folgenden Tipps sind deshalb ebenfalls für ein Vorstellungsgespräch relevant. ", Information01: "Dies ist eine INFO", Question: "HalloHalli"), Topic(Title: "Interviews", Image: "Window3", Text: "„Hallo Tim. Vielen Dank für deine Bewerbung. Wir möchten dich gerne näher kennenlernen und schlagen dir ein persönliches Interview vor. Passt dir nächsten Mittwoch?“ Endlich hat es Tim geschafft zu einem Vorstellungsgespräch eingeladen zu werden. Aber was soll er ohne viel Berufserfahrung erzählen? Eigentlich ist das Vorstellungsgespräch gar nicht so schwierig zu meistern wie viele denken. Auch ohne Berufserfahrung kannst du viele interessante und spannende Dinge erzählen, die dein Gegenüber begeistern und dafür Sorge tragen, dass du den Job bekommst. ", Information01: "Dies ist eine INFO", Question: "HalloHalli"), Topic(Title: "Selbstreflexion", Image: "Window4", Text: "Marie ist einige Monate in einem Werkstudenten Job und fragt sich nun, ob sie direkt fest beim Unternehmen einsteigen sollte, oder ob es nochmal sinnvoll wäre ein neuen Praktikum bzw. eine neue Werkstudententätigkeit zu verfolgen. Auf der einen Seite reizt es sie nochmal etwas neues zu machen, auf der anderen Seite hat sie Angst die falsche Entscheidung zu treffen und sich den Weg zurück zu verbauen.", Information01: "Dies ist eine INFO", Question: "HalloHalli"), Topic(Title: "Mit Kollegen & Chef interagieren ", Image: "Window5", Text: "Du bist also mittendrin in deinen ersten Arbeitswochen und versucht einen guten Eindruck bei deinen Kollegen zu hinterlassen, was nicht einfach ist. Wie überall ist natürlich auch der erste Eindruck auf der Arbeit zum großen Teil entscheidend dafür, was die Menschen für ein Bild von dir haben. Besonders dein Team und dein Chef werden dies in den ersten Arbeitstagen genau beobachten. Lass uns am Beispiel von „Tim“ herausfinden, welche Verhaltensmuster mit hoher Wahrscheinlichkeit kompetent oder inkompetent von seinen Kollegen gedeutet werden.", Information01: "Dies ist eine INFO", Question: "HalloHalli"), Topic(Title: "Übernahme / Neuer Job", Image: "Window6", Text: "Stell dir vor du bist nun seit ein paar Monaten bei einem Unternehmen. Das Team ist super und das Unternehmen gefällt dir auch. Du kannst dir gut vorstellen fest anzufangen und möchtest schon vorab alle Weichen so stellen, dass vielleicht sogar dein Chef und deine Kollegen auf dich proaktiv zukommen. Um die Chancen bei einem Unternehmen fest einzusteigen zu steigern musst du zeigen, dass du alle Aufgaben die ein Festangestellter erledigt, ebenfalls kannst. Deine Strategie sollte also sein dir alle nötigen Fähigkeiten anzueignen. Hast du die Grundlagen erlernt geht es darum ein wertgeschätztes und unersetzbares Teambestandteil zu werden. Dies gilt für den sozialen Umgang mit deinem Team und auch Chef. ", Information01: "Dies ist eine INFO", Question: "HalloHalli"), ] } }

問題是什么?

第 1 頁上:當我單擊“開始講座”按鈕時,沒有任何反應。

應該發生什么?

它應該顯示Page2

為什么我瘦了?

我讀到導航視圖和環境對象相處得不太好。 但是我不知道具體問題是什么。

我是否收到任何錯誤消息?

不,一切正常

我希望你們能幫助我,我真的很感激。

您需要在整個應用程序中使用相同的ViewRouter實例。

TopicCell視圖中,您正在創建ViewRouter實例:

return NavigationLink(destination: LectureFullView(topic: topic).environmentObject(ViewRouter())) {

所以當你在LectureFullView修改實例時,不會影響原來的實例。

要解決此問題,您需要傳遞環境中已存在的相同實例:

struct TopicCell: View {
    @EnvironmentObject var viewRouter: ViewRouter // get EnvironmentObject
    
    let topic : Topic

    var body: some View {
        // pass the existing `viewRouter` to the destination view
        NavigationLink(destination: LectureFullView(topic: topic).environmentObject(viewRouter)) {
        ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM