Как использовать оператор if со структурой в SwiftUI? - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь использовать оператор if со значением bool в структуре, чтобы посмотреть, следует ли отображать представление содержимого с использованием этих данных. Я продолжаю получать ошибку «Неоднозначная ссылка на« индексы членов »», но я знаю, что это не настоящая проблема, это просто swiftUI, говорящий, что есть ошибка в forEach, когда она находится внутри forEach. Это определение структуры, где needsToBeDeleted по умолчанию имеет значение false, потому что оно должно отображаться при первом создании

import Foundation

struct SEvent {
    var eventName:String;
    var timeSpent:String;
    var timeStarted:Date;
    var lastStarted:Date?;
    var needsToBeDeleted = false;
}

, и это фрагмент, где я перебираю массив событий

ForEach(arrayOfEvents.indices, id: \.self) { index in
  if !self.arrayOfEvents[index].needsToBeDeleted {
     EventContentView(eventName: self.arrayOfEvents[index].eventName, timeSpent: 
     self.arrayOfEvents[index].timeSpent, shouldDelete: 
     self.$arrayOfEvents[index].needsToBeDeleted)
  }

}

Также это объявление массива, если это поможет

@State private var arrayOfEvents = [SEvent]();

Редактировать:

Это код представления содержимого события

import SwiftUI

struct EventContentView: View {
    var eventName:String;
    var timeSpent:String;

    var startStop = ["Start", "Stop"];
    @State var deleteTrigger = false;
    var buttonColor = [Color.blue, Color.yellow]
    @State var i = 0;
    @Binding var shouldDelete:Bool;
    var body: some View {

        VStack{
            VStack{
                Text("\(eventName)")
                    .frame(minWidth: 0, idealWidth: 150, maxWidth: 200, minHeight: 0, idealHeight: 50, maxHeight: 75, alignment: .center)

                Text("\(timeSpent)")
                    .frame(minWidth: 0, idealWidth: 150, maxWidth: 200, minHeight: 0, idealHeight: 50, maxHeight: 100, alignment: .leading)
                if !deleteTrigger {
                HStack {
                Button(action: {
                    if self.i == 0{

                        self.i = 1
                    }
                    else if self.i == 1 {
                        self.i = 0
                    }

                }) {
                    Text(startStop[i])
                }

                .foregroundColor(buttonColor[i])
                .frame(minWidth: 0, idealWidth: 50, maxWidth: 100, minHeight: 0, idealHeight: 20, maxHeight: 40, alignment: .leading)
                    Button(action: {
                        self.deleteTrigger = true;
                    }) {
                       Text("Delete")
                    }
                    .foregroundColor(.red)
                    .animation(.interactiveSpring(response: 1, dampingFraction: 0.5, blendDuration: 1.5))
                    .frame(minWidth: 0, idealWidth: 50, maxWidth: 100, minHeight: 0, idealHeight: 20, maxHeight: 40, alignment: .trailing)
                }

            }
                else{
                    HStack {
                       Button(action: {
                        self.shouldDelete = true
                       }) {
                           Text("Delete")
                       }
                       .foregroundColor(.red)
                       .frame(minWidth: 0, idealWidth: 50, maxWidth: 100, minHeight: 0, idealHeight: 20, maxHeight: 40, alignment: .leading)
                           Button(action: {
                            self.deleteTrigger = false;
                           }) {
                              Text("Don't Delete")

                           }
                           .foregroundColor(.green)
                            .animation(.easeInOut)
                        .frame(minWidth: 0, idealWidth: 50, maxWidth: 100, minHeight: 0, idealHeight: 20, maxHeight: 40, alignment: .trailing)
                       }

                }
            }
            .frame(minWidth: 0, maxWidth: 200, minHeight: 20, idealHeight: 30, maxHeight: 150, alignment: .center)
        }
        .padding()
        .overlay(
        RoundedRectangle(cornerRadius: 5.0)
            .stroke(Color.black, lineWidth: 1)
            .shadow(radius: 5)
            )
        .padding()

    }
}

и спецификация c часть, которая удаляет представление, является этой кнопкой, где она изменяет переменную привязки shouldDelete на true, которая изменяет элемент needsToBeDeleted структуры SEvent в arrayOfEvents на true

Button(action: {
 self.shouldDelete = true
}) 
{
   Text("Delete")
}

1 Ответ

1 голос
/ 23 марта 2020

Вы можете использовать это так

var body: some View {
        ForEach(arrayOfEvents.indices, id: \.self) { index -> AnyView in
            if !self.arrayOfEvents[index].needsToBeDeleted {
                return AnyView(EventContentView(eventName: self.arrayOfEvents[index].eventName, timeSpent:
                    self.arrayOfEvents[index].timeSpent, shouldDelete:
                    self.$arrayOfEvents[index].needsToBeDeleted))

            } else {
                return AnyView(EmptyView())
            }

        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...