如何判断NavigationPath中是否包含NSManagedObject类型对象?
因为NavigationPath本身没有提供contains()方法,且它存储的是类型擦除后的AnyHashable元素,结合你使用的是Core Data的NSManagedObject子类Item,可以通过以下两种方式实现需求:
方法一:扩展NavigationPath,添加Item专属判断方法
利用Item的objectID(Core Data对象的唯一标识)做匹配,即使对象因Core Data的fault机制生成不同实例,也能准确判断是否在路径中:
extension NavigationPath { func containsItem(_ targetItem: Item) -> Bool { return self.elements.contains { element in guard let item = element as? Item else { return false } return item.objectID == targetItem.objectID } } }
在视图中直接调用该方法即可:
NavigationLink(value: item) { Text("Item at \(item.timestamp!.formatted())") } .disabled(navigation.path.containsItem(item))
方法二:在Navigation类中维护Item的ID集合
如果需要更灵活的扩展(比如后续支持多种路径元素类型),可以在Navigation类中额外维护一个存储Item的objectID的集合,保持和path状态同步:
final class Navigation: ObservableObject { @Published var path = NavigationPath() private(set) var includedItemIDs = Set<NSManagedObjectID>() // 同步更新路径和ID集合的方法 func pushItem(_ item: Item) { path.append(item) includedItemIDs.insert(item.objectID) } func popItem() { guard let lastElement = path.last as? Item else { path.removeLast() return } path.removeLast() includedItemIDs.remove(lastElement.objectID) } func popToRoot() { path.removeLast(path.count) includedItemIDs.removeAll() } }
使用时直接判断集合中是否包含当前Item的ID:
.disabled(navigation.includedItemIDs.contains(item.objectID))
注意:第二种方法需要确保includedItemIDs和path的状态始终同步,所有修改path的操作都要对应更新集合。
内容的提问来源于stack exchange,提问作者parapote
相关产品推荐
相关产品推荐

