当前位置: 首页 > 知识库问答 >
问题:

在SwiftUI中使用外部函数内部绑定

陈康胜
2023-03-14

我目前正在学习SwiftUI,想开发自己的应用程序。我设计了一个loginview和一个loginhandler,它们应该处理登录背后的所有逻辑。当用户输入错误的用户名/密码时,屏幕上应该会出现一个警报。我用状态变量loginerror解决了这个问题。但现在出现了棘手的部分,因为我想将这个变量的绑定传递给loginhandler中的登录函数。看一下下面的代码:


import SwiftUI

struct LoginView: View
{
    @EnvironmentObject var loginHandler: LoginHandler
    
    @State private var username: String = ""
    @State private var password: String = ""
    @State private var loginError: Bool = false
    
    ...
    
    private func login()
    {
        loginHandler.login(username: username, password: password, error: $loginError)
    }
}

我现在正在尝试更改登录函数中的错误值:

import Foundation
import SwiftUI

class LoginHandler: ObservableObject
{
    public func login(username: String, password: String, error: Binding<Bool>)
    {
        error = true
    }
}

但我发现了错误

无法赋值:“error”是“let”常量

我认为这是有意义的,因为你不能在Swift中编辑参数。我还尝试过_error=true,因为我曾经看到下划线与绑定结合使用,但这也不起作用。

但后来我想到了一个工作解决方案:error.wrappedvalue=true。我唯一的问题是苹果开发人员文档中的以下语句:

此属性提供对值的数据的主要访问。但是,您不直接访问wrappedValue。取而代之的是,使用与@binding属性一起创建的property变量。

虽然我超级高兴它起作用了,但我想知道有没有更好的办法来解决这种情况呢?

共有2个答案

周泰
2023-03-14

我知道你想做什么,但它会在后面引起问题,因为你在这里处理的是状态。现在一个解决办法是:

  • 您可以将错误抽象到类中,但这样就会将用户名密码放在一个位置,而将错误放在另一个位置。

理想的解决方案是在同一地点把它全部抽象化。从您的视图中删除所有属性,并将其设置为如下所示:

   import SwiftUI

struct LoginView: View
{
    @EnvironmentObject var loginHandler: LoginHandler
    

   
   // login() <-- Call this when needed
    ...
    
    
}

那么在你的课堂上:

    import Foundation
    import SwiftUI
    
  @Published error: Bool = false
   var username = ""
   var password = ""

    class LoginHandler: ObservableObject
    {
        
       

       public func login()    {
           //If you can't login then throw your error here
           self.error = true
   }
    }

您唯一要做的是更新username和password`,例如,您可以通过以下操作来完成

TextField("username", text: $loginHandler.username)
TextField("username", text: $loginHandler.password)
柴宏浚
2023-03-14

你也可以更新一个函数的参数,这里是一个例子,这不是使用绑定或状态,它是inout!

我现在正在尝试更改登录函数中的错误值:

无法赋值:“error”是“let”常量

所以用这个方法或例子你可以!

struct ContentView: View {
    
    @State private var value: String = "Hello World!"
    
    var body: some View {
        
        Text(value)
            .padding()
        
        Button("update") {
            
            testFuction(value: &value)
        }
        
    }
}


func testFuction(value: inout String) {
    
    value += " updated!"
}
 类似资料:
  • 我刚刚开始学习React和JavaScript。在我阅读了留档和教程之后,我看了一下示例项目,并试图整理我还没有得到的内容。 然后我看到有一些函数是在函数内部定义的,还有一些函数是在函数外部定义的。 例如,在之外: 和内部render()。。。 为什么它们看起来如此不同,为什么你想在内部和外部有一些函数? 编辑: 之外的函数的另一个示例: EDIT2:在另一个线程中,有人回答说,如果函数背后的逻辑

  • 我正在尝试通过与分支内联的am调用c中的外部函数。我正在编译为arm m0指令集,但它返回错误表达式。 代码是: 回报是: 我们需要做什么?

  • 严格说来,Ruby中没有函数.但Kernel模块中定义的方法(可以在任何地方用做函数,因此)可被其他语言当做函数来调用.若您对这些方法进行再定义时,就必需考虑到对其他方面的影响. `str 把字符串str当做外部命令来运行,并以字符串方式返回命令的输出.使用`str`形式来调用该方法(还可以使用%x(...)表示法进行调用.请参考命令输出). 可以使用$?来了解命令的结束状态. 若您只想执行命令,

  • 问题内容: 我有一些代码,其结构类似于此 问题是它向我吐了一个错误。 解析错误:语法错误,意外的T_LNUMBER,预期的T_VARIABLE或’$’ 有关于如何在bbcode函数的preg_replace内调用embed_video的想法吗? 谢谢! 问题答案: 您可以在上使用“ e”修饰符(请参见模式修饰符) 告诉将第二个参数视为PHP代码。

  • 问题内容: 我对所有页面都有一个通用模板,其中包含一个菜单栏,它位于.bar的外面。我位于其中一个页面的内部,我想将输入数据绑定到此模板区域(该区域位于与输入页面不同的控制器下) )。我的意思是当我输入名称时,该名称将出现在模板区域。可以吗?这是the **** 问题答案: 通过遵循始终具有“’ ”的“最佳实践”,可以很容易地避免使用基元出现此问题。在您的ng模型中 -观看3分钟值得。Misko演

  • 本文向大家介绍layui.use模块外部使用其内部定义的js封装函数方法,包括了layui.use模块外部使用其内部定义的js封装函数方法的使用技巧和注意事项,需要的朋友参考一下 用途:常用于监听输入框(其内部不提供监听函数)。 用法:需要在 use 中定义 window 函数供外部引用。 以上这篇layui.use模块外部使用其内部定义的js封装函数方法就是小编分享给大家的全部内容了,希望能给大