首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使我的自定义ViewModifier只在SwiftUI中符合(可识别和视图)的内容/视图上工作?

如何使我的自定义ViewModifier只在SwiftUI中符合(可识别和视图)的内容/视图上工作?
EN

Stack Overflow用户
提问于 2021-03-20 07:14:14
回答 1查看 285关注 0票数 0

我正在使我的View Identifiable像下面的代码:

代码语言:javascript
复制
struct RedView: View, Identifiable {
    
    let id: UUID = UUID()
    
    var body: some View {

        Color.red.frame(width: 100, height: 100, alignment: .center)
        
        
    }
}

现在我想做一个只适用于ViewModifier,视图( Views,即Identifiable )的CustomViewModifier,例如,为了使普通的question/problem不需要我们的内容符合Identifiable,它们必须符合View,在这个question/problem中,我想做一个要求CustomViewModifier,它的内容符合ViewIdentifiable,我怎么能这样做呢?

在这里,到目前为止尝试过的东西,需要帮助才能完成:

代码语言:javascript
复制
struct CustomViewModifier<InPutContent: View & Identifiable>: ViewModifier {

    func body(content: InPutContent) -> some View  {

        return content.onAppear() { print(content.id) }

    }

}

用例:

代码语言:javascript
复制
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!
 
    }
}

更新:

代码语言:javascript
复制
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) }

    }

}

用例:

代码语言:javascript
复制
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
        
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-20 07:51:49

ViewModifier的要求之一是您能够修改任何视图。显然,在这种情况下不能这样做,所以ViewModifier不合适。

尝试在View where Self: Identifiable上编写一个扩展,而不是:

代码语言:javascript
复制
extension View where Self: Identifiable {
    func printId() -> some View  {
        return onAppear() { print(id) }
    }
}

用法:

代码语言:javascript
复制
struct ContentView: View {

    var body: some View {

        RedView()
            .printId()  // compiles
        
        Text("Hello")
            .printId()  // does not compile
 
    }
}

Comparison between ViewModifier and extensions

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66719127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档