SwiftUI泛型视图中如何从rowContent获取文本字符串?
解决SwiftUI泛型视图中获取Text实例内字符串的问题
SwiftUI的Text视图没有公开API允许直接提取其内部存储的文本内容,因为视图的核心职责是渲染展示,而非数据存储。要解决这个问题,需要换思路从数据传递层面入手,而非从视图实例中反向提取数据,以下是两种可行方案:
方案一:为MyView新增文本提取参数
直接在泛型视图中新增一个专门用于获取目标字符串的闭包参数,将数据逻辑与视图渲染逻辑分离:
struct MyView<Item, Content: View>: View { let fetchRequest: FetchRequest<Item> let rowContent: (Item) -> Content let rowText: (Item) -> String // 新增:负责提取每个Item对应的文本 init(fetchRequest: FetchRequest<Item>, rowContent: @escaping (Item) -> Content, rowText: @escaping (Item) -> String) { self.fetchRequest = fetchRequest self.rowContent = rowContent self.rowText = rowText } var body: some View { List(fetchRequest.wrappedValue) { item in rowContent(item) .swipeActions { Button("执行操作") { let targetText = rowText(item) // 直接拿到目标字符串 // 在这里使用字符串做后续处理 } } } } } // ParentView调用示例 MyView(fetchRequest: ..., rowContent: { item in Text(item.name ?? "") }, rowText: { item in item.name ?? "" })
方案二:使用自定义视图容器封装数据与视图
定义一个自定义视图,同时包含要展示的Text和对应的字符串数据,让MyView通过这个容器直接获取数据:
// 自定义容器:同时承载文本数据和渲染视图 struct TextWithData: View { let rawText: String var body: some View { Text(rawText) } } // 修改MyView的泛型约束,限定rowContent返回TextWithData struct MyView<Item>: View where Item: NSManagedObject { let fetchRequest: FetchRequest<Item> let rowContent: (Item) -> TextWithData var body: some View { List(fetchRequest.wrappedValue) { item in let textContainer = rowContent(item) textContainer .swipeActions { Button("执行操作") { let targetText = textContainer.rawText // 直接获取字符串 // 在这里使用字符串做后续处理 } } } } } // ParentView调用示例 MyView(fetchRequest: ...) { item in TextWithData(rawText: item.name ?? "") }
内容的提问来源于stack exchange,提问作者arroyot24
相关产品推荐
相关产品推荐

