我正在SwiftUI中使用联系人应用程序进行工作,该应用程序将显示数百个电话号码。有些联系人的详细信息视图包含地址和备用号码,而有些联系人则没有。 例如,Harry Smith将在行中列出基本电话分机,同时在详细信息视图中列出他的手机号码和地址。 但是,二楼浴室的电话号码仅需在该行中使用基本电话分机,而无需包含浴室编号和地址的详细视图。 如何为那些没有相关详细信息的联系人禁用导航链接?
答案 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)
}
}
......
优点:您可以轻松自定义“已禁用”的单元格。