我可以为SwiftUI列表中的一组指定单元格禁用Navigationlink吗?

时间:2020-05-15 00:02:16

标签: swiftui-navigationlink

我正在SwiftUI中使用联系人应用程序进行工作,该应用程序将显示数百个电话号码。有些联系人的详细信息视图包含地址和备用号码,而有些联系人则没有。 例如,Harry Smith将在行中列出基本电话分机,同时在详细信息视图中列出他的手机号码和地址。 但是,二楼浴室的电话号码仅需在该行中使用基本电话分机,而无需包含浴室编号和地址的详细视图。 如何为那些没有相关详细信息的联系人禁用导航链接?

1 个答案:

答案 0 :(得分:0)

我更喜欢根据条件添加 NavigationLink。 我将有一个包含一些内容的“单元格”。 (图像/文件详细信息)

A - 构建“内容”视图:

   struct MediumFileContentRow: View {

    var file: MediumFile

    var body: some View {
        VStack (alignment: .leading) {
            let (name, attribs) = file.getInfo() // get from model..
            Text(name)
            Spacer()
            Text(attribs)
        }// VStack
    }
}

B - 您的单元格 (MediumFileRow) 将有条件地在我们的内容视图“周围”添加链接 (NavigationLink),并将使用 AnyView 返回不同的视图:

struct MediumFileRow: View {
    var file: MediumFile


var body: some View {
        let enabled = NavigationLink(destination: Detail(t: file.name!)) {
            MediumFileContentRow(file: file)
        }
        let disabled = MediumFileContentRow(file: file)
        
        return file.isEmpty ? AnyView(disabled) : AnyView(enabled)

    }

所有(几乎..)代码:

struct MediumFileContentRow: View {
    var file: MediumFile

    var body: some View {
        VStack (alignment: .leading) {
            let (s,sd) = file.displayed()
            Text(s)
            Spacer()
            Text(sd).font(.system(size: 9.0))
        }// VStack
    }
}


struct MediumFileRow: View {
    var file: MediumFile
    
    var body: some View {
        let enabled = NavigationLink(destination: Detail(t: file.name!)) {
            MediumFileContentRow(file: file)
        }
        let disabled = MediumFileContentRow(file: file)
        
        return file.isEmpty ? AnyView(disabled) : AnyView(enabled)

    }
    ...

.. 在列表中您将拥有:

var body: some View {

NavigationView{
....


 List {
                    ForEach(mediumFiles, id: \.self) { file in
                        MediumFileRow(file: file)
                    }
                }

......

优点:您可以轻松自定义“已禁用”的单元格。