如何制作一个接受任何对象的 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 中制作分页的 ScrollView?
如何在 SwiftUI 中定义结构属性以接受线性或角度渐变?