键盘在一张纸上

Isa*_*aac 5 xcode ios swiftui

我有一个带有输入字段的基本窗口(第1页),在它的顶部出现一个弹出窗口(第2页),其中还有一个输入字段和按钮,单击时会弹出一个小窗口带有输入字段(第 3 页)。如果键盘上没有显示“Done”,则界面功能正常。如果添加一个“完成”按钮,结果是,当从第 2 页移动到第 3 页时,它的颜色从系统颜色蓝色变为灰色。实验并想知道为什么会这样,我发现第 1 页上的工具栏负责第 3 页上按钮的颜色...如果您更改第 1 页工具栏上按钮的颜色 - 它将在第 3 页工具栏上更改,第 2 页不会受到影响。此外,添加按钮会导致错误:“[LayoutConstraints] 无法同时满足约束。” 我想知道为什么在第 1 页上设置了键盘上的按钮,而在第 3 页上打字时也得到了一个按钮?为什么它变灰并且不起作用?为什么如果我更改第 1 页上的按钮的颜色,第 3 页上的灰色按钮的颜色也会更改吗?

一个具有代表性的小样本:

内容视图

import SwiftUI

struct ContentView: View {
    @State private var bloodClucoseLvl: String = ""
    @State private var isSheetShown: Bool = false
    @FocusState private var focusField: Bool
    var body: some View {
        NavigationView {
            List {
                Section("Add your current blood glucose lvl") {
                    TextField("5,0 mmol/l", text: $bloodClucoseLvl)
                        .focused($focusField)
                }
                Section("Add food or drink") {
                    Button(action:{
                        isSheetShown.toggle()
                    }, label:{
                        HStack{
                            Text("Add")
                            Image(systemName: "folder.badge.plus")
                        }
                    })
                    .sheet(isPresented: $isSheetShown) {
                        addFoodButton()
                    }
                }
            }
            .navigationTitle("Page 1 - General")
            .toolbar{
                ToolbarItem(placement: .keyboard) {
                    HStack {
                        Spacer()
                        Button(action: {
                            focusField = false
                        }) {
                            Text("Done")
                        }
                    }
                }
            }
            .ignoresSafeArea(.keyboard)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Run Code Online (Sandbox Code Playgroud)

添加食物按钮

import SwiftUI

struct addFoodButton: View {
    @State private var selectedFood: String = ""
    @State public var addScreen: Bool = false
    var body: some View {
        ZStack {
            NavigationView {
                List {
                    Section("or choose from category"){
                        NavigationLink(destination: Alcohol(addScreen: $addScreen)){
                            Text("Alcohol")
                        }
                    }
                }
                .listStyle(.insetGrouped)
                .searchable(text: $selectedFood, prompt: "Search by word")
                .navigationTitle("Page 2 - Search in DB")
            }
            if addScreen{
                addScreenView(addScreen: $addScreen)
            }
        }
    }
}

struct Alcohol: View {
    @State private var searchInsideCategory: String = ""
    @Binding var addScreen: Bool
    var body: some View {
        List {
            Button(action: {addScreen.toggle()}){
                Text("Light beer")
            }
        }
        .navigationTitle("Page 2 - Choose beer")
        .searchable(text: $searchInsideCategory, prompt: "Search inside a category")
    }
}

struct addFoodButton_Previews: PreviewProvider {
    static var previews: some View {
        addFoodButton()
    }
}
Run Code Online (Sandbox Code Playgroud)

添加屏幕视图

import SwiftUI

struct addScreenView: View {
    @Binding var addScreen: Bool
    @State private var gram: String = ""
    var body: some View {
        ZStack{
            Color.black.opacity(0.2).ignoresSafeArea()
            VStack(spacing:0){
                Text("Page 3 - Add an item")
                    .bold()
                    .padding()
                Divider()
                VStack(){
                    TextField("gram", text: $gram)
                        .padding(.leading, 16)
                        .padding(.trailing, 16)
                        .keyboardType(.numberPad)
                    Rectangle()
                        .frame(height: 1)
                        .padding(.leading, 16)
                        .padding(.trailing, 16)
                }.padding()
                Divider()
                HStack(){
                    Button(action: {
                        addScreen.toggle()
                    }){
                        Text("Cancel").frame(minWidth:0 , maxWidth: .infinity)
                    }
                    Divider()
                    Button(action: {
                        addScreen.toggle()
                    }){
                        Text("Save").frame(minWidth:0 , maxWidth: .infinity)
                    }
                }.frame(height: 50)
        }
        .background(Color.white.cornerRadius(10))
        .padding([.leading, .trailing], 15)
        }
    }
}

struct addScreenView_Previews: PreviewProvider {
    static var previews: some View {
        addScreenView(addScreen: .constant(true))
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在此输入图像描述