在TabView内的SwiftUI中编辑NavigationBarItems和NavigationBarTitle

时间:2020-05-27 14:08:03

标签: ios swift swiftui

我正在尝试在SwiftUI应用中更改导航栏标题以及前导和尾随项目。 情况如下: 用户登录后,将其转移到TabView内部的视图中。 登录之前,在欢迎屏幕以及登录和注册屏幕中,我没有导航栏标题,但是登录后,我想添加导航栏项目和标题。 重要的是要知道我的登录后视图位于TabView内部。 如果我将登录后的视图包装在新的NavigationView中,然后更改导航栏的项目和标题,它将起作用!但它显示了2个导航栏: the top is the first navigation bar and the bottom is the new navigation bar

这不是我想要的。

这是我使用的代码: 这是登录后视图

       import SwiftUI

       struct DiscoveryView: View {
             var body: some View {
                  List{
                       Text("List Items")
                  }.offset(y: 10)
                   .navigationBarTitle("", displayMode: .inline)
                   .navigationBarItems(leading:
                     Text("Discovery").font(Font.custom("Quicksand-             Bold", size: 24))
                   , trailing:
                       Button(action: {

                       }) {
                          HStack{
                             Text("120").font(Font.custom("Quicksand-Bold", size: 15)).foregroundColor(Color("BlueColor"))
                          Text("following").font(Font.custom("Quicksand-Bold", size: 15)).foregroundColor(Color.black)
                         }
                    }
                  ).navigationBarBackButtonHidden(true)
                }
              }

这是TabView:

struct TabController : View {

@State private var selection = 0
var body: some View {
    TabView(selection: $selection){

        DiscoveryView()
            .tabItem {
                VStack {
                    Image(systemName: "list.dash")
                    Text("Discover")
                }
        }.tag(1)

        ExploreView()
            .tabItem {
                VStack {
                    Image(systemName: "square.and.pencil")
                    Text("Explore")
                }
        }.tag(2)
        SelfProfileView()
            .tabItem{
                VStack {
                    Image(systemName: "person.circle")
                    Text("Profile")

                }
        }.tag(3)

    }.accentColor(Color("BlueColor"))
}

}

这是登录页面的代码:

import SwiftUI

struct LoginView: View {

var body: some View {
    ZStack{
        VStack{
            Image("mainLogo").resizable().frame(width: 250, height: 125)
            Text("").frame(width: UIScreen.main.bounds.width, height: 100)
            HStack{
                TextField("Username / Email", text: $email)
                    .padding(.leading, 10)
                    .frame(width: 313, height: 49)
                    .background(RoundedRectangle(cornerRadius: 4).stroke( Color.black.opacity(0.3)).frame(width: 313, height: 39).background(Color("GrayColor")))
            }
            Text("").frame(width: UIScreen.main.bounds.width, height: 40)
            HStack {
                HStack{
                        if self.visable{
                            TextField("Password", text: $password)
                                .padding(.horizontal)

                        } else {
                            SecureField("Password", text: $password)
                                .padding(.horizontal)

                        }
                        Button(action: {
                            self.visable.toggle()
                        }){
                            Image(systemName: self.visable ? "eye.slash" : "eye")
                                .padding(.trailing, 20)
                                .foregroundColor(Color.black)
                        }
                }.background(RoundedRectangle(cornerRadius: 4).stroke( Color.black.opacity(0.3)).frame(width: 313, height: 39).background(Color("GrayColor")) )
            }.padding(.horizontal, 40).padding(.vertical)
            Text("").frame(width: UIScreen.main.bounds.width, height: 100)
            Button(action: {
                //pass email password and conpassword to cognito
                DSManager().signIn(username: self.email, password: self.password, error: {
                    error in
                    if let error = error{
                        self.error = error.errorString
                        self.alert.toggle()
                        print(error.errorString)
                    }
                    else{
                        DSManager().getSelfUserInformation(response: {
                            userInfo, userCollections,dsError in
                            if let dsError = dsError{
                                self.error = dsError.errorString
                                self.alert.toggle()
                                print(dsError.errorString)
                            }
                            if let userInfo = userInfo{
                                print("success")
                                //use userInfo to load stuff for profile page
                                if let userCollections = userCollections{
                                    self.profileInfo.setProperties(userInfo: userInfo, collections: userCollections)
                                }
                                else{
                                    self.profileInfo.setProperties(userInfo: userInfo, collections: [:])
                                }
                                self.isComplete.toggle()

                            }
                        })
                    }
                })
            }) {
                Text("Login")
                    .fontWeight(.semibold)
                    .frame(width: 313, height: 48)
                    .background(fillAllFields() ? Color("YellowColor") : Color.gray)
                    .foregroundColor(Color.white)
                    .font(.system(size: 17))
                    .cornerRadius(15)
                    .shadow(color: Color("GrayColor"), radius: 0, x: 3, y: 3)
            }.disabled(!fillAllFields())
            NavigationLink(destination: ProfileView(), isActive: $isComplete) {
                EmptyView()
            }
            Spacer()
        }
        .padding()
        .navigationBarTitle("", displayMode: .inline)
        if self.alert {
            ErrorView(err: $error, alert: $alert)
        }
    }
}

func fillAllFields() -> Bool {
    if self.email == "" || self.password == "" {
        return false
    }
    return true
}

}

如前所述,我正在尝试编辑栏项以及其中的视图标题和选项卡视图。

谢谢!

1 个答案:

答案 0 :(得分:0)

因此,根据您更新的问题,我在DiscoveryView内添加了NavigationView,它按预期运行。我还添加了代码和屏幕截图。

struct TabController : View {

@State private var selection = 0

var body: some View {
    TabView(selection: $selection) {
        NavigationView {
        DiscoveryView()
        }
            .tabItem {
                VStack {
                    Image(systemName: "list.dash")
                    Text("Discover")
                }
        }.tag(1)

        Text("Explore View")
            .tabItem {
                VStack {
                    Image(systemName: "square.and.pencil")
                    Text("Explore")
                }
        }.tag(2)
        Text("SelfProfileView")
            .tabItem{
                VStack {
                    Image(systemName: "person.circle")
                    Text("Profile")

                }
        }.tag(3)

    }.accentColor(Color("BlueColor"))
}} 

DiscoveryView with navigation leading and trailing view