Swift中如何在闭包内访问CustomButton的buttonText属性?
错误原因分析
- 第一个错误
Instance member 'buttonText' cannot be used on type 'CustomButton':buttonText是CustomButton的实例属性,只能通过具体的实例对象访问,直接用类型CustomButton去访问必然报错。 - 第二个错误
Cannot find pageTitle in scope:pageTitle是主视图的变量,CustomButton的代码作用域里没有这个变量,因此无法直接修改。
三种可行解决方案
方案1:直接在主视图复用buttonText变量
这是最简单的方式,无需修改CustomButton代码,只需在主视图中将传入的buttonText存为变量,再在闭包里直接用该变量赋值给pageTitle:
// 主视图代码 let targetTitle = "To Do" CustomButton(buttonText: targetTitle, action: { todoList = dataService.getTodo() pageTitle = targetTitle })
方案2:让CustomButton的action闭包接收buttonText参数
修改CustomButton,将action闭包改为可接收字符串参数的类型,点击按钮时自动把buttonText传递出去:
// 修改后的CustomButton struct CustomButton: View { var buttonText: String // 将action改为接收String的闭包 var action: (String) -> Void var body: some View { Button(action: { // 调用闭包时传入当前的buttonText action(buttonText) }, label: { Text(buttonText) }) .padding() .border(.blue) } }
主视图调用时,直接用闭包参数赋值给pageTitle:
CustomButton(buttonText: "To Do", action: { receivedTitle in todoList = dataService.getTodo() pageTitle = receivedTitle })
方案3:用@Binding让CustomButton直接修改主视图的pageTitle
如果每次点击按钮都需要将pageTitle设为按钮文字,可通过@Binding将主视图的pageTitle绑定到CustomButton中,让按钮直接修改该值:
// 修改后的CustomButton struct CustomButton: View { var buttonText: String var action: () -> Void // 添加绑定的pageTitle属性 @Binding var pageTitle: String var body: some View { Button(action: { // 先执行原本的action逻辑 action() // 直接修改绑定的pageTitle pageTitle = buttonText }, label: { Text(buttonText) }) .padding() .border(.blue) } }
主视图调用时,用$符号传递绑定的pageTitle:
CustomButton(buttonText: "To Do", action: { todoList = dataService.getTodo() }, pageTitle: $pageTitle)
内容的提问来源于stack exchange,提问作者Veloz
相关产品推荐
相关产品推荐

