swift - 如何使我的自定义 ViewModifier 仅适用于 SwiftUI 中符合(可识别和视图)的内容/视图?
问题描述
我正在使我的视 Identifiable
图像这样的代码:
struct RedView: View, Identifiable {
let id: UUID = UUID()
var body: some View {
Color.red.frame(width: 100, height: 100, alignment: .center)
}
}
现在我想制作一个仅适用于或适用于它们的视图的CustomViewModifier ,例如,要制作普通的 ViewModifier,我们不需要我们的内容符合,它们必须符合,在这个问题/问题中,我想做一个要求其内容符合的CustomViewModifier和,我该怎么做?Identifiable
Identifiable
View
View
Identifiable
到目前为止,这里有什么尝试,需要帮助来完成:
struct CustomViewModifier<InPutContent: View & Identifiable>: ViewModifier {
func body(content: InPutContent) -> some View {
return content.onAppear() { print(content.id) }
}
}
用例:
import SwiftUI
struct ContentView: View {
var body: some View {
RedView()
.modifier(CustomViewModifier()) // It must work! because RedView is Identifiable!
Text("Hello")
.modifier(CustomViewModifier()) // It must NOT work! because Text is not Identifiable!
}
}
更新:
struct CustomViewModifier<InPutContent: View & Identifiable>: ViewModifier {
var inPutContent: () -> InPutContent
func body(content: Content) -> some View {
return body2(content: inPutContent())
}
func body2(content: InPutContent) -> some View {
return content.onAppear() { print(content.id) }
}
}
用例:
import SwiftUI
struct ContentView: View {
var body: some View {
RedView()
.modifier(CustomViewModifier(inPutContent: { RedView() })) // compiles
Text("Hello")
.modifier(CustomViewModifier(inPutContent: { Text("Hello") })) // does not compile
}
}
解决方案
One of the requirements of ViewModifier
is that you are able to modify any view. Clearly, you cannot do that in this case, so ViewModifier
is not suitable.
Try writing an extension on View where Self: Identifiable
instead:
extension View where Self: Identifiable {
func printId() -> some View {
return onAppear() { print(id) }
}
}
usage:
struct ContentView: View {
var body: some View {
RedView()
.printId() // compiles
Text("Hello")
.printId() // does not compile
}
}
推荐阅读
- android - 解析失败:Lcom/amazonaws/mobileconnectors/cognitoauth/handlers/AuthHandler;
- node.js - webpack 捆绑后无法加载 zmg.node
- ionic-framework - IONIC 3 InAppBrowser 执行脚本
- powerbi - 在 PowerBI 中提取最后一个空格之前的文本
- c# - 如何从 python *在同一进程中运行 c# 代码*?
- python - 如何向使用 nx.shortest_path 创建的路线添加一个点?
- typo3 - 在详细视图中插入媒体图像
- sql - 出现错误 在执行 DB2 EXPORT IXF 时处理 Action String 参数中的 SELECT 字符串时出现 SQL 错误“-204”?
- excel - 将大字符串与excel中的百分比差异进行比较
- reactjs - 在 react-dates 中突出显示某些日期