问题:使用NavigationView和Environment Object(按钮操作)在Swift UI中传递数据

时间:2020-10-02 12:09:50

标签: ios swiftui swiftui-list swiftui-navigationlink swiftui-environment

概述

我写了一个应用程序,可以阅读和“播放”不同的电子学习讲座。首先,您可以在导航视图中选择一个讲座,然后在概述中了解其内容。之后,您可以通过按“概述”中的“开始”按钮来开始演讲并播放不同的级别视图。级别的“视图”通过“下一步”按钮连接。

问题(有关文档,请参见下文)

我不知道如何继续将数据从 View 2 传递到 View 3 4

当前,当您单击 View1 中的列表时,您将获得相应的讲座概述(View2)。但是,单击 View2 中的“开始演讲”按钮时,您将始终在 View 3 中看到从演讲1 [0]获取的数据。实际上,它确实从 SwiftFile 中提取数据,但仅从array [0]中提取数据,而不是从相应主题[0] ... [5]中动态提取数据。

如何将所选讲座的信息传递给 View3 4

VIEW1 ->“ MainMenuList”(NavigationView,当前有6个讲座)

//
//  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 {
    
    @EnvironmentObject var viewRouter: ViewRouter
    
    let topic : Topic

    var body: some View {

        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)
                }
            }
        }
    }
}

选择特定的讲座

VIEW2 ->“ LectureOverView”(图像,ShortSummaryText,按钮“ StartLecture”)

//
//  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())
    }
}

点击按钮

VIEW3 ->“ LectureLevelPartOne”(文本,按钮“下一步”)

//
//  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{
                Spacer()

                HStack{
                    
                Button(action: {
                     self.viewRouter.currentPage = "page0"
                 })
                 {
                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 {
    @State private var info = Topic.all()
    @EnvironmentObject var viewRouter: ViewRouter
    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)
        
    
    }
}

点击按钮

VIEW4 ->“ LectureLevelPartTwo”(文本,按钮“下一步”)... (尚未构建)

SwiftFile :存储了第1到第6讲的所有数据(标题,OverviewText,LevelOneText,LevelTwoText等)的数组。

//
//  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.", 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"),
        ]
        
        
    }
}

母亲视图:通过环境对象选择按钮( View2、3、4 )时切换视图

//
//  LectureMotherView.swift
//  NewCareerFriends
//
//  Created by Tobias Reidl on 27.09.20.
//  Copyright © 2020 Tobias Reidl. All rights reserved.
//

import SwiftUI

struct LectureMotherView: View {
    
    @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

//
//  ViewRouter.swift
//  NewCareerFriends
//
//  Created by Tobias Reidl on 27.09.20.
//  Copyright © 2020 Tobias Reidl. All rights reserved.
//

import Foundation
import Combine
import SwiftUI

class ViewRouter: ObservableObject {
    
        let objectWillChange = PassthroughSubject<ViewRouter, Never>()
    
        var currentPage: String = "page0" {
            didSet {
                objectWillChange.send(self)
            }
        }
}

非常感谢你们。我对每一个提示或技巧都很有帮助:-)

德国最诚挚的问候 托比

0 个答案:

没有答案