SwiftUI - 如何在我的视图中调用函数?

Posted

技术标签:

【中文标题】SwiftUI - 如何在我的视图中调用函数?【英文标题】:SwiftUI - How can I call a Function in my View? 【发布时间】:2020-08-03 15:34:56 【问题描述】:

我已经使用 SwiftUI/Swift 一个星期了,我喜欢它。现在我有一个问题。我想从我的视图中调用一个函数,但我得到了这个错误

类型'()'不能符合'View';只有结构/枚举/类类型可以符合协议

这是代码:

struct testView: View 
    
    
    var body: some View 
        VStack 
            Text("TextBox")
            Text("SecondTextBox")
            self.testFunction()
        
    
    
    func testFunction() 
        print("This is a Text.")
    
    

我不明白。在其他语言中,它要简单得多,并且可以这样工作。有人可以帮我吗? Swift 对我来说很新:D

【问题讨论】:

目前尚不清楚您将在什么时候使用该功能做什么,因为在正文的上下文中,大多数情况下只期望视图。那你能详细说明一下吗? 我只是在玩 SwiftUI。我试图在视图中执行一个 for,但我做不到。有没有办法在视图中执行函数或 for's? 【参考方案1】:

同时这里是(不是全部)可以调用函数的位置/方式

    init() 
        self.testFunction()     // non always good, but can
    

    var body: some View 
        self.testFunction()            // 1)
        return VStack 
            Text("TextBox")
               .onTapGesture 
                  self.testFunction()    // 2)
               
            Text("SecondTextBox")
        
        .onAppear 
            self.testFunction()     // 3)
        
        .onDisappear 
            self.testFunction()     // 4)
        
    

...等等

【讨论】:

啊好吧,我现在明白了一点。但是为什么在VStack之前有一个“返回”呢? 因为body 是具有不透明返回类型的计算属性,所以在这种情况下需要明确指示返回的内容以确定类型。【参考方案2】:

使用 Swift 5.3 和 Xcode 12.4

我使用一个小扩展来调试视图(示例中为 VStack),例如检查geometryReader.size。它可用于调用视图中的任何函数,如下所示:

注意:仅用于调试目的。我不建议在任何生产代码中包含这样的代码

VStack 
    Text.console("Hello, World")
    Text("TEXT"


extension Text 
    static func console<T>(_ value: T) -> EmptyView 
        print("\(value)")
        return EmptyView()
    

这将在控制台打印“Hello, World”.....

【讨论】:

【参考方案3】:

在编写 swift UI(ios 应用程序)时,有一个原因是需要遵循 View 协议。从结构内部调用函数不符合协议。

您可以做的最好的事情是 .on(insertTimeORAction here)。

Read more about it here

【讨论】:

以上是关于SwiftUI - 如何在我的视图中调用函数?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 视图 onAppear 事件调用回扫手势动作

SwiftUI - 如何通过视图模型完成调用函数

如何在 SwiftUI 子视图中执行函数?

在 SwiftUI 中,如何根据异步调用确定要显示的视图

SwiftUI:从另一个初始化程序调用它时,如何让我的闭包返回“内容”而不是“某些视图”?

将变量从 UIHostingController 传递到 SWIFTUI 视图