Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 尝试创建3列可删除按钮的行,但按钮的第一行不可删除_Swift_Button_Swiftui - Fatal编程技术网

Swift 尝试创建3列可删除按钮的行,但按钮的第一行不可删除

Swift 尝试创建3列可删除按钮的行,但按钮的第一行不可删除,swift,button,swiftui,Swift,Button,Swiftui,这篇文章是关于。在3列按钮上创建行后,当点击“删除按钮”时,前3个按钮在点击“垃圾”图像时不可删除。但是,可以删除第二行按钮(即tag4)。知道这里出了什么问题吗?所有按钮都应该是可删除的 这是密码 class SomeData: ObservableObject{ @Published var buttonObjects: [ButtonObject] = [ButtonObject(name: "tag1", isSelected: false),

这篇文章是关于。在3列按钮上创建行后,当点击“删除按钮”时,前3个按钮在点击“垃圾”图像时不可删除。但是,可以删除第二行按钮(即tag4)。知道这里出了什么问题吗?所有按钮都应该是可删除的

这是密码

class SomeData: ObservableObject{
    @Published var buttonObjects: [ButtonObject] = [ButtonObject(name: "tag1", isSelected: false),
                                                   ButtonObject(name: "tag2", isSelected: false), ButtonObject(name: "tag3", isSelected: false), ButtonObject(name: "tag4", isSelected: false)]
}

struct someData3: View {
    @Environment(\.editMode) var mode
    @ObservedObject var someData = SomeData()
    @State var newButtonTitle = ""
    @State var isEdit = false

    var body: some View {
        NavigationView{
//            List{ // VStack
                VStack{
//                    Spacer()
                    VStack(alignment: .leading){//
                            ForEach(0..<someData.buttonObjects.count/3+1) { row in // create number of rows
                                HStack{
                                    ForEach(0..<3) { column in // create 3 columns
                                            self.makeView(row: row, column: column)
//                                        makeView2(row: row, column: column, someData: self.someData, isEdit: self.$isEdit)
                                    }
                                }
                            }.id(UUID())
                        }



                    HStack{
                        TextField("Enter new button name", text: $newButtonTitle){
                            let newObject = ButtonObject(name: self.newButtonTitle, isSelected: false)
                            self.someData.buttonObjects.append(newObject)
                            self.newButtonTitle = ""
                        }
                    }

                    Spacer()

                    HStack{
                        Text("isEdit is ")
                        Text(String(self.isEdit))
                        }
                }
                .navigationBarItems(leading: Button(action: {self.isEdit.toggle()}){Text("Delete Button")},
                                 trailing: EditButton())


                }




    }


    func makeView(row: Int, column: Int) -> some View{
        let ind = row * 3 + column
        return Group{
            if ind<self.someData.buttonObjects.count {
                   Button(action: {
                    self.someData.buttonObjects[ind].isSelected = !self.someData.buttonObjects[ind].isSelected
                    print("Button pressed! buttonKeyName is: \(self.someData.buttonObjects[ind].name) Index is \(ind)")
                    print("bool is \(self.someData.buttonObjects[ind].isSelected)")

                   }) {

                    Text(self.someData.buttonObjects[ind].name)

                   }
                   .buttonStyle(GradientBackgroundStyle(isTapped: self.someData.buttonObjects[ind].isSelected))
                    .overlay(Group {
                         if self.isEdit {
                             ZStack {
                                 Button(action: {self.deleteItem(ind: ind)}) {
                                    Image(systemName: "trash")
                                         .foregroundColor(.red).font(.title)
                                 }.padding(.trailing, 3)
                                    .alignmentGuide(.top) { $0[.bottom] }
                             }
                            .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing) //topTrailing

                            }
                        }
                    )
                   .padding(.bottom, 20)


            }
            else{
                EmptyView()

            }
        }

    }






    func deleteItem(ind: Int) {
        let name = someData.buttonObjects[ind].name
        print(" deleting ind \(ind), key: \(name)")
        self.someData.buttonObjects.remove(at: ind)
       }


}
class SomeData:ObservableObject{
@已发布的变量ButtonObject:[ButtonObject]=[ButtonObject(名称:“tag1”,isSelected:false),
ButtonObject(名称:“tag2”,isSelected:false),ButtonObject(名称:“tag3”,isSelected:false),ButtonObject(名称:“tag4”,isSelected:false)]
}
结构someData3:视图{
@环境(\.editMode)变量模式
@ObservedObject变量someData=someData()
@State var newButtonTitle=“”
@状态变量isEdit=false
var body:一些观点{
导航视图{
//列表{//VStack
VStack{
//垫片()
VStack(对齐:。前导){//

ForEach(0..可能会出现问题,因为顶部按钮的覆盖与
导航视图
标题栏重叠,这将阻止按钮的输入

如果在
VStack
中添加一些背景色,您将看到顶部按钮的垃圾按钮实际上位于VStack之外:

NavigationView {
    VStack {
        ...
    }
    .background(Color.red)
}
解决方案之一是通过删除以下行将垃圾箱图像移近按钮的中间:

.alignmentGuide(.top) { $0[.bottom] }
或者,您可以确保垃圾箱按钮不会与
NavigationView
标题栏重叠。例如,您可以在
VStack
上方添加一个小空间,以使垃圾箱按钮适合内部:

NavigationView {
    VStack {
        Spacer()
            .frame(height: 10)
        VStack {
        ...
    }
}
使用
也可以得到相同的结果。填充

Button(action: { }) {
    ...
}
.buttonStyle(...)
.overlay(...)
.padding(.top, 20)

谢谢你的提示。我无法删除这一行。alignmentGuide(.top){$0[.bottom]}因为我希望垃圾桶按钮出现在按钮上方一点。我想添加间隔符().frame(高度:10)是个好主意!