Как перейти к определенному представлению вкладок после выполнения действия с SwitUI? - PullRequest
1 голос
/ 10 ноября 2019

Я пытаюсь создать приложение для управления виртуальным центром обработки данных (серверы, политики брандмауэра, балансировщики нагрузки ...). У меня есть два раздела (с помощью вкладки). Один показывает список всех элементов, которые вы создали в своем центре обработки данных. Другой раздел - создание новых элементов. Если мы запустим приложение, мы начнем с раздела списка. Затем я пытаюсь создать новый сервер. Для этого я перехожу в раздел «Создать», нажимаю «Сервер» и выбираю «Размер», здесь первые две проблемы, которые я не смог решить:

  1. Почему параметры выбора делают маленькимпрыгнуть в верхнюю часть экрана? Как я могу удалить это?
  2. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1009*. Как можно это убрать?

И последняя проблема, с которой я столкнулся, заключается в том, что после создания сервера я возвращаюсь в раздел «Создание» и хочу перейти непосредственно к разделу «Список» . Как я могу это сделать?

Вот основной код, чтобы увидеть вопросы / проблемы, которые у меня есть. Заранее спасибо за любую помощь!

import SwiftUI

struct ContentView: View {
    @State private var selectedTab = 1
    var body: some View {
        TabView(selection: $selectedTab){
            CreateView()
                .tabItem {
                    Image(systemName: "plus")
                    Text("Create")
                }.tag(0)
            ListView()
                .tabItem {
                    Image(systemName: "cloud")
                    Text("List")
                }.tag(1)
        }
    }
}


struct CreateView: View {
    var body: some View {
         VStack{
           NavigationView{
               List{
                   NavigationLink(destination: CreateServerView()){
                       Text("Server")
                   }
                   Text("Firewall Policy")
                   Text("Load Balancer")
               }
               .navigationBarTitle("Select the element you want to create", displayMode: .inline)
           }
        }
    }
}

struct ListView: View {
    var body: some View {
        NavigationView{
            List{
                Section(header: Text("Servers")){
                    Text("Server 1")
                    Text("Server 2")
                }
                Section(header: Text("Firewall policies")){
                    Text("Firewall 1")
                    Text("Firewall 2")
                }
            }
            .navigationBarTitle("My virtual datacenter", displayMode: .large)
        }
    }
}

struct CreateServerView: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    @State private var name: String = ""
    @State private var selectedFixServer = 0

    @State private var serverType = ["S", "M", "L", "XL"]
    var body: some View {
        NavigationView {
            Form {
                Section(header: Text("Name of the server")){
                    TextField("Name", text: $name)
                }
                Picker(selection: $selectedFixServer, label: Text("Size")) {
                    ForEach(0 ..< serverType.count) {
                        Text(self.serverType[$0])
                    }
                }
            }
            .navigationBarTitle("")
            .navigationBarHidden(true)
        }
        .navigationBarTitle("Create Server")
        .navigationBarBackButtonHidden(true)
        .navigationBarItems(
            leading:
                Button(action: {
                    self.presentationMode.wrappedValue.dismiss()
                }) {
                    Text("Cancel")
                },
            trailing:
                Button(action: {
                    self.presentationMode.wrappedValue.dismiss()
                }) {
                    Text("Create")
                }
        )
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Ответы [ 2 ]

2 голосов

Один из вариантов - использовать .pickerStyle (SegmentedPickerStyle ()), но я не знаю, подходит ли вам это. С этим решением 2 проблемы решаются, и вам не нужно много места для этого:

enter image description here

Теперь о:

перейдите непосредственно к разделу списка

В вашем примере я просто создаю @Binding var selectedTab в CreateServerView и изменяю его перед удалением:

struct CreateServerView: View {
    // ...
    @Binding var selectedTab: Int
    // ...
        trailing:
                Button(action: {
                    self.selectedTab = 1
                    self.presentationMode.wrappedValue.dismiss()
                }) {
                    Text("Create")
                })
// ...
}

вам нужнопередать эту переменную, и она сразу перейдет к списку после создания сервера

1 голос
/ 11 ноября 2019
  1. Почему параметры выбора делают маленький прыжок в верхней части экрана? Как я могу удалить его?
  2. Слишком много места между верхней частью экрана и параметрами средства выбора. Как его удалить?

Это потому, что вы создали второй NavigationView внутри существующего NavigationView. Поэтому, чтобы это исправить, просто удалите NavigationView из вашего CreateServerView (скажем, замените его на VStack и т. Д.)

Примечание : когда я экспериментировал с вашим кодом, я также прокомментировал следующие две строки

//                .navigationBarTitle("")
//                .navigationBarHidden(true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...