Swiftui - 列表第一项的不同视图(布局)

Posted

技术标签:

【中文标题】Swiftui - 列表第一项的不同视图(布局)【英文标题】:Swift Ui - Different View(Layout) for first item of a List 【发布时间】:2020-04-12 18:03:33 【问题描述】:

我对@9​​87654321@ 比较陌生。我想实现weatherList 的第一项以不同的视图显示。

不幸的是,我在这 2 行 (VStack and at ForEach-Line) 中收到此错误。如果我把if i == 0 收起来,然后只用于所有listitems 的正常布局,就没有错误。

ERROR: Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols

这是我的代码:

var body: some View 

    NavigationView 

        VStack  // here first error

            if self.model.error != nil 

                Text(self.model.error!)

            

            ForEach(0..<self.model.weatherList.count, id: \.self)  i in // here second error



                if i == 0 

                    NavigationLink(destination: DetailView(model: self.model.weatherList[i])) 

                        RowView(model: self.model.weatherList[i])

                    

                

                else

                    NavigationLink(destination: DetailView(model: self.model.weatherList[i])) 

                        RowView(model: self.model.weatherList[i])

                    

                

            



        

        .navigationBarTitle(Text("Weather in " + UserSettings.instance.locationSetting))

        .navigationBarItems(trailing:

            Button(action: 

                self.model.reload()

            ) 

                Image(systemName: "arrow.clockwise")

            

            .disabled(model.reloading)

        )

    


不胜感激每一个建议。谢谢。

【问题讨论】:

【参考方案1】:

我还没有尝试过,但是如果你像这样包装 NavigationLink 会怎样:

    if i == 0 
        AnyView(
            NavigationLink(destination: DetailView(model: self.model.weatherList[i])) 
                RowView(model: self.model.weatherList[i])
        )
     else 
        AnyView(
            NavigationLink(destination: DetailView(model: self.model.weatherList[i])) 
                RowView(model: self.model.weatherList[i])
        )
    

【讨论】:

【参考方案2】:

在没有其他代码来编译的情况下确定它有点棘手,但我在本地模拟了它,看起来你需要更改的只是:

            ForEach(0..<self.model.weatherList.count, id: \.self)  i in

            ForEach(0..<self.model.weatherList.count)  i in // remove the id: argument

说明:

如果您使用范围来遍历您的数组,则不要使用 id: 参数。范围是自动识别的。 ForEach(_:id:content:) 初始化器用于您可能会说的情况

ForEach(self.model.weatherlist, id: \.self)  model in 
    SomeView(model: model)

这适合你吗?

编辑:您给出的示例看起来无论索引是否为 0,它都会做同样的事情。如果您尝试它不起作用,是否有原因:

                ForEach(0..<self.model.weatherList.count)  i in
                NavigationLink(destination: DetailView(model: self.model.weatherList[i])) 
                    RowView(model: self.model.weatherList[i])
                
            

【讨论】:

以上是关于Swiftui - 列表第一项的不同视图(布局)的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何让列表视图中的图像与列表项的操作不同?

Espresso 如何点击一个 ImageView 放置在 listview 的第一项?

仅显示一项的列表视图

SwiftUI 列表中某些行的布局问题

当列表填满屏幕时,RecyclerView 显示第一项的副本

带有 SwiftUI 的 Apple Watch 上列表项的背景 [重复]