0

我有两个数组。

maschineItems: [MaschineItem]

maschines: [Maschine]

两个对象都具有属性“名称”

在我的视图中,我想检查机器数组中是否存在 maschineItem 的名称。我想为机器中存在的所有 maschineItems 制作一个“light Bubble”,为机器中不存在的所有 maschineItems 创建一个“dark Bubble”。

这是我的代码(有效):

import SwiftUI
import Combine

struct OverviewView: View {
    
    @FetchRequest(fetchRequest: MaschineItem.getAllMaschines()) var maschineItems:FetchedResults<MaschineItem>
    @State var networkManager = NetworkManager()
    
    var body: some View {
        
        NavigationView{
            ScrollView{
                VStack(spacing: 30) {
                    ForEach(maschineItems) { maschineItem in
                        if NetworkManager.maschines.contains(where: {$0.name == maschineItem.name}) {
                            
                            BubbleView(locationText: "TEST LOCATION", textIo: "/", textnIo: "/", maschineItem: maschineItem, color: .dividerBackground, opacity: 0.25)
                            
                        }else {
                            BubbleView(locationText: "Unknown device", textIo: "/", textnIo: "/", maschineItem: maschineItem, color: .gray, opacity: 0.5)
                        }
                    }
                }
            }
            .navigationBarTitle("Übersicht", displayMode: .large)    
        }
    }

现在我想让 Bubbles 包含有关机器的信息。所以我必须在 if 语句之前初始化匹配,不是吗?但是当我这样做时:

    var body: some View {
        
        NavigationView{
            ScrollView{
                VStack(spacing: 30) {
                    ForEach(maschineItems) { maschineItem in
                        if let maschines = NetworkManager.maschines.first(where: {$0.name == maschineItem.name}) {
                            
                            BubbleView(locationText: "\(maschines.location.building) / \(maschines.location.workcell)", textIo: "\(maschines.resultCountiO)", textnIo: "\(maschines.location.resultCountniO)", maschineItem: maschineItem, color: .dividerBackground, opacity: 0.5)
                            
                        }else {
                            BubbleView(locationText: "Unknown device", textIo: "/", textnIo: "/", maschineItem: maschineItem, color: .gray, opacity: 0.5)
                        }
                    }
                }
            }
            .navigationBarTitle("Übersicht", displayMode: .large)   
        }
    }

我在 if 语句的行中收到以下错误:

Closure containing control flow statement cannot be used with function builder 'ViewBuilder'

我该如何解决这个问题?我进行了很多研究,发现了类似的线程,这表明我必须使用该array.first(where: {})方法,但我没有发现任何可以帮助我解决这个问题的方法。是的,我试图创建一个函数,因为视图中的逻辑是错误的。但是当我将所有这些都写在一个函数中时,就会发生同样的错误。

我真的很感谢所有试图帮助我的人。PS:我是德国人,对不起英语:D

4

1 回答 1

0

我会使用一个计算变量来提供您需要的数据,避免if let. 在我的示例中,我添加了一个计算变量 ( matchedMachines),它是一个元组数组。元组中的第一个值是Machine实例。第二个值是Bool表示是否找到机器的 a。

//
//  ContentView.swift
//  BubbleTest
//
//  Created by Paul Wilkinson on 26/6/20.
//

import SwiftUI

struct Machine: Identifiable {
    let id = UUID()
    let name: String
    let colour: String
}

struct ContentView: View {
    
    var machines = [Machine(name: "Bob", colour: "Grey"), Machine(name:"Susan",colour: "Purple"), Machine(name: "Mary", colour: "Red"), Machine(name: "Peter", colour: "Green")]
    
    var names = ["Bob","Mary"]
    
    var matchedMachines: [(Machine,Bool)]  {
        get {
            return machines.map { ($0, names.contains($0.name))
            }
        }
    }
    
    var body: some View {
        VStack(spacing:30) {
            ForEach(matchedMachines, id: \.0.id ) { machineTuple in
                BubbleView(bubbleColor: machineTuple.1 ? .blue:.gray) {
                    Text(machineTuple.0.name)
                    Text("Location: \(machineTuple.1 ? "Test Location" : "Location Unknown")")
                }
            }
        }
    }
}

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

struct BubbleView<Content: View>: View {
    let content: Content
    var bubbleColor: Color
    
    init(bubbleColor: Color, @ViewBuilder content: () -> Content) {
        self.bubbleColor = bubbleColor
        self.content = content()
    }
    
    var body: some View {
        VStack {
            content
        }
        .padding()
        .background(bubbleColor)
        .cornerRadius(12.0)
    }
    
}

struct BubbleView_Previews: PreviewProvider {
    static var previews: some View {
        BubbleView(bubbleColor: .blue) {
            Text("Hello world")
        }
    }
}
于 2020-06-26T12:24:05.133 回答