如何制作一个接受任何对象的 swiftui viewmodifier?

Posted

技术标签:

【中文标题】如何制作一个接受任何对象的 swiftui viewmodifier?【英文标题】:how do I make a swiftui viewmodifier that accepts any object? 【发布时间】:2021-05-31 15:36:37 【问题描述】:

我的项目中有很多可重复使用的视图修改器,但我从来没有能够制作一个接受任何对象而不是特定对象的视图修改器。

外汇。在下面的 viewmodifier 中,我如何让它接受任何对象而不仅仅是“StopContent”,这样我每次想在新对象上使用它时都不必编写新的 viewModifier?

struct DragToDeleteContent: ViewModifier 
    
    let stopContent:StopContent
    @Binding var contentArray: [StopContent]
    @State private var deleted:Bool = false
    
    func body(content: Content) -> some View 
        return content
            .dragToDelete(deleted: $deleted)
            .onChange(of: deleted, perform:  deleted in
                if deleted  delete() 
            )
    
    
    func delete() 
        if let arrayIndex = contentArray.firstIndex(of: stopContent) 
            contentArray.remove(at: arrayIndex)
        
    

【问题讨论】:

【参考方案1】:

每个模型都使用Identifiable 协议进行确认,因此您可以通过 Identifiable 使其通用。

这是可能的解决方案

struct DragToDeleteContent<T: Identifiable>: ViewModifier 
    
    let stopContent: T
    @Binding var contentArray: [T]
    @State private var deleted:Bool = false
    
    func body(content: Content) -> some View 
        return content
            .dragToDelete(deleted: $deleted)
            .onChange(of: deleted, perform:  deleted in
                if deleted  delete() 
            )
    
    
    func delete() 
        if let arrayIndex = contentArray.firstIndex(where: $0.id == stopContent.id) 
            contentArray.remove(at: arrayIndex)
        
    

数据模型

struct TestModel: Identifiable 
    var id = UUID()
    var name: String

用法

.modifier(DragToDeleteContent(stopContent: TestModel(name: "Abc"), contentArray: .constant([.init(name: "Xyz"), .init(name: "opq")]))) // I used .constant for the demo purpose. Bind you Identifiable array here.

【讨论】:

谢谢,它为我节省了 100 行冗余代码,并让我知道我错过了一些重要的东西。 现在我只需要弄清楚如何在我用于拖放视图修饰符的单例类中使用它。这可能是一个新问题:)

以上是关于如何制作一个接受任何对象的 swiftui viewmodifier?的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中制作聊天应用程序:如何让 ScrollView 在键盘出现时保持原位?

如何在 SwiftUI 中制作具有透明背景的模态视图?

有没有办法在 SwiftUI 中制作分页的 ScrollView?

如何在 SwiftUI 中定义结构属性以接受线性或角度渐变?

如何创建只接受数字和单个点的 SwiftUI TextField?

SwiftUI:动态设置图像的大小