Can';不要在SWIFTUI中使用切换行为来触发.buttonStyle
我有两种钮扣样式,mainButtonOn和mainButtonOff。我希望我的按钮根据其切换状态使用一个或另一个。下面的代码抛出错误“无法推断复杂的闭包返回类型;显式添加类型以消除歧义。” 我是SwiftUI的新手,所以如果你能看到这个问题,我希望你能把你的答案压低一点。谢谢大家Can';不要在SWIFTUI中使用切换行为来触发.buttonStyle,swift,button,swiftui,toggle,Swift,Button,Swiftui,Toggle,我有两种钮扣样式,mainButtonOn和mainButtonOff。我希望我的按钮根据其切换状态使用一个或另一个。下面的代码抛出错误“无法推断复杂的闭包返回类型;显式添加类型以消除歧义。” 我是SwiftUI的新手,所以如果你能看到这个问题,我希望你能把你的答案压低一点。谢谢大家 import SwiftUI struct ContentView: View { var displayTime = "Ahoy" func getTime(oldTime: Int, adde
import SwiftUI
struct ContentView: View {
var displayTime = "Ahoy"
func getTime(oldTime: Int, addedTime: Int) -> Int {
return oldTime + addedTime
}
@State var hoursOn:Bool = true
struct mainButtonOff: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.frame(width: 110, height: 35, alignment: .center)
.background(Color.white)
.foregroundColor(Color.gray)
.cornerRadius(30)
.overlay(RoundedRectangle(cornerRadius: 30) .stroke(Color.gray, lineWidth: 1))
}
}
struct mainButtonOn: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.frame(width: 110, height: 35, alignment: .center)
.background(Color.blue)
.foregroundColor(Color.white)
.cornerRadius(30)
.overlay(RoundedRectangle(cornerRadius: 30) .stroke(Color.blue, lineWidth: 1))
}
}
var body: some View {
let displayTime = String(getTime(oldTime: 15, addedTime: 10)) // get time and turn it into a string
return VStack { // ***** ERROR: Unable to infer complex closure return type; add explicitly type to disambiguate.
//Spacer()
Text(displayTime)
//Spacer()
Button(action: {self.hoursOn.toggle()}) {
Text("Hours")
.font(.headline)
}
.buttonStyle(self.hoursOn ? mainButtonOn() : mainButtonOff())
//.buttonStyle(mainButtonOff()) // <= USING THIS LINE INSTEAD THROWS NO ERROR
}
}
}
导入快捷界面
结构ContentView:View{
var displayTime=“Ahoy”
func getTime(oldTime:Int,addedTime:Int)->Int{
返回oldTime+addedTime
}
@状态变量hoursOn:Bool=true
结构mainButtonOff:ButtonStyle{
func makeBody(配置:Self.configuration)->一些视图{
配置标签
.框架(宽:110,高:35,对齐:。中心)
.背景(颜色.白色)
.foregroundColor(颜色.灰色)
.转弯半径(30)
.overlay(圆角矩形(拐角半径:30).笔划(颜色.灰色,线宽:1))
}
}
结构mainButtonOn:ButtonStyle{
func makeBody(配置:Self.configuration)->一些视图{
配置标签
.框架(宽:110,高:35,对齐:。中心)
.背景(颜色.蓝色)
.foregroundColor(颜色.白色)
.转弯半径(30)
.overlay(圆角矩形(拐角半径:30).笔划(颜色:蓝色,线宽:1))
}
}
var body:一些观点{
让displayTime=String(getTime(oldTime:15,addedTime:10))//获取时间并将其转换为字符串
return-VStack{//****错误:无法推断复杂的闭包返回类型;请显式添加类型以消除歧义。
//垫片()
文本(显示时间)
//垫片()
按钮(操作:{self.hoursOn.toggle()}){
文本(“小时”)
.font(.headline)
}
.buttonStyle(self.hoursOn?mainButtonOn():mainButtonOff())
//.buttonStyle(mainButtonOff())/一种方法是绕过该问题:
if self.hoursOn {
Button(action: {self.hoursOn.toggle()}) {
Text("Hours").font(.headline)
}.buttonStyle(mainButtonOn())
} else {
Button(action: {self.hoursOn.toggle()}) {
Text("Hours").font(.headline)
}.buttonStyle(mainButtonOff())
}
另一个更简洁的方法是:
struct mainButtonOnOff: ButtonStyle {
let onoff: Bool
init(_ switsh: Bool) {
self.onoff = switsh
}
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.frame(width: 110, height: 35, alignment: .center)
.background(self.onoff ? Color.blue : Color.white)
.foregroundColor(self.onoff ? Color.white : Color.gray)
.cornerRadius(30)
.overlay(RoundedRectangle(cornerRadius: 30) .stroke(self.onoff ? Color.blue : Color.gray, lineWidth: 1))
}
}
and:
Button(action: {self.hoursOn.toggle()}) {
Text("Hours") .font(.headline)
}.buttonStyle(mainButtonOnOff(self.hoursOn))
我想知道为什么有人会投票否决这个问题。新的贡献者已经产生了代码,并遵循了解决问题的逻辑方法,但它仍然不起作用。非常感谢workingdog。您的变通方法非常有效。我仍在试图理解您更简洁的解决方案。您是否在buttonStyle中添加了第二个切换来解决问题长边按钮切换?不,没有第二个切换。主按钮非关闭仅根据“hoursOn”值控制颜色。