【问题标题】:Modify view from within a view modifier从视图修改器中修改视图
【发布时间】:2020-05-10 04:10:50
【问题描述】:

我有一个 HighlightedText 视图,它用一个字符串、一个默认字体和一个高亮字体初始化。字符串可以有标记来指示它的哪些部分需要突出显示。这一切都很好。现在,我不想用默认字体和高亮字体初始化它,而是希望能够以更 swift-ui 的方式编写它,以提供更大的灵活性并提高准备度。所以我希望能够做这样的事情:

HighlightedText("My text <highlighted>")
   .defaultFont(.body)
   .highlightFont(.title)

我知道标准方式应该是使用 ViewModifier,但是我从它的主体函数中得到的只是一个内容类型,似乎没有办法可以将它转换为我的 HighlightedText 视图并根据需要进行配置.我似乎能够从它的主体中做的只是从 View 协议中调用其他修饰符,但这对于我的用例来说还不够。

我已经尝试过这个扩展,其中 defaultFont 是在 HighlightedText 中定义的文件私有 @State 属性:

extension HighlightedText {
    func defaultFont(_ font: Font) -> some View {
        defaultFont.font = font
        return body
    }
}

但是,这不起作用。我传递的默认字体永远不会被应用。

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    这是可能的解决方案:

    如果你有这样的声明

    struct HighlightedText: View {
        var defaultFount = Font.body
        var highlightedFont = Font.headline
    
        // ... other code
    

    那么你的自定义修饰符可以是

    extension HighlightedText {
        func defaultFont(_ font: Font) -> Self {
            var view = self
            view.defaultFount = font
            return view
        }
    
        func highlightedFont(_ font: Font) -> Self {
            var view = self
            view.highlightedFont = font
            return view
        }
    }
    

    【讨论】:

    • 谢谢!在进行更改之前,我错过了将视图声明为变量。另一件事是无论如何我可以做到这一点,但用 ViewModifier 代替?因为由于我正在处理突出显示的文本类型,所以我只能在创建此组件之后和调用任何其他修饰符之前调用这些函数,否则我会丢失类型,然后无法调用这些方法。
    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    相关资源
    最近更新 更多