構造体間の@bindingに関する問題

Aug 17 2020

私のコードでは:

struct Specialty {
    let type:String
    let color:Color
    let image:Image
}

// MARK: Search
struct Search: View {
   
    @State var show = false
    @State var txt = ""
    @State  var index = 1
    let specialtyList = [
        Specialty(type: "Cardiologia", color: Color.blue, image: Image("google1") ),
        Specialty(type: "Clínica Médica", color: Color.pink, image: Image("google1")),
        Specialty(type: "Dermatologia", color: Color("Color"), image: Image("google1")),
        Specialty(type: "Ginecologia e Obstetrícia", color: Color.pink, image: Image("google1")),
        Specialty(type: "Medicina do Trabalho", color: Color.red, image: Image("google1")),
        Specialty(type: "Oftalmologia", color: Color("Color"), image: Image("google1")),
        Specialty(type: "Ortopedia", color: Color.pink, image: Image("google1")),
        Specialty(type: "Otorrinolaringologia", color: Color.blue, image: Image("google1")),
        Specialty(type: "Pediatria", color: Color.red, image: Image("google1")),
        Specialty(type: "Psiquiatria", color: Color("Color"), image: Image("google1")),
        Specialty(type: "Radiologia", color: Color("Color"), image: Image("google1"))
    ]
}

同じgoogle1画像を無視して、最初にコードを機能させようとしています。

次に、検索のビューで、私は持っています:

ForEach(specialtyList, id: \.type){ Specialty in
    NavigationLink (destination: SearchBar()){
        VStack(spacing: 18) {
            HStack{
                Text(Specialty.type).foregroundColor(.white)
                Specialty.image
                    .renderingMode(.original)
                    .resizable()
                    .frame(width: 35, height: 35)
            }
        }
    }
}

'letspecialtyList'の情報をscrollViewとして表示します

表示される各ワールドはボタンとして機能するので、目的地(この場合はSearchBar())に移動するときに、押されたNavigationLinkテキストに応じて異なる情報を表示したいと思います。

リスト「specialtyList」の順序を使用してそれを行うにはどうすればよいですか。また、押されたNavigationLinkテキストと同じ名前を宛先に簡単に印刷するにはどうすればよいですか。

回答

Asperi Aug 17 2020 at 10:42

これだと思います

注:タイプ(特殊、大文字など)とインスタンス/値(特殊、小文字など)に同じ名前を付けないようにしてください。そうしないと、コンパイラとユーザーが混乱する可能性があります。

ForEach(specialtyList, id: \.type){ specialty in   // << named correctly
    NavigationLink (destination: SearchBar(item: specialty)){  //  << inject here
        VStack(spacing: 18) {
            HStack{
                Text(specialty.type).foregroundColor(.white)
                specialty.image
                    .renderingMode(.original)
                    .resizable()
                    .frame(width: 35, height: 35)
            }
        }
    }
}

そして今見えている

struct SearchBar: View {
   let item: Specialty

   var body: some View {
      Text(item.type)

      // .. other code
   }
}