Swiftui 运行时错误:前提条件失败:属性未能设置初始值
我有一个视图Swiftui 运行时错误:前提条件失败:属性未能设置初始值,swiftui,navigationlink,Swiftui,Navigationlink,我有一个视图BugSplitView,它单独工作很好,但会导致 前提条件失败:属性未能设置初始值 在预览或模拟器中导航到时出错 该视图的上半部分(颜色)和下半部分(颜色)由水平按钮条分隔,并使用GeometeryReader和拆分状态进行布局。当它是NavigationButton的目标时,它不会在预览中正确显示,并在模拟器中运行时报告上述断言。移除BugButtonBar,它就会工作。把我难住了!救命啊 import SwiftUI struct BugSplitView: View {
BugSplitView
,它单独工作很好,但会导致
前提条件失败:属性未能设置初始值
在预览或模拟器中导航到时出错
该视图的上半部分(颜色)和下半部分(颜色)由水平按钮条分隔,并使用GeometeryReader和拆分状态进行布局。当它是NavigationButton的目标时,它不会在预览中正确显示,并在模拟器中运行时报告上述断言。移除BugButtonBar
,它就会工作。把我难住了!救命啊
import SwiftUI
struct BugSplitView: View {
@State var split : CGFloat = 0.75
var buttons : [BugButtonBar.Info]{
[BugButtonBar.Info(title: "title", imageName: "text.insert"){}]
}
var body: some View {
GeometryReader{ g in
VStack(spacing: 0){
Color.gray
.frame(width: g.size.width, height: (g.size.height) * self.split)
VStack{
BugButtonBar(infos: self.buttons)
Color(white: 0.3)
}
.frame(height: (g.size.height) * (1 - self.split))
}
}.edgesIgnoringSafeArea(.all)
}
}
struct BugButtonBar : View{
struct Info : Identifiable {
var id = UUID()
var title : String
var imageName : String
var action: () -> Void
}
var infos : [Info]
func color() -> Color{
Color.black
}
var body: some View {
HStack(){
Spacer()
ForEach(self.infos){ info in
Button(action: info.action){
Text(info.title)
}
Spacer()
}
}
}
}
struct ShowBugView : View{
var body : some View{
NavigationView {
NavigationLink(destination: BugSplitView()){
Text("Show Bug")
}
}
}
}
struct BugSplitView_Previews: PreviewProvider {
static var previews: some View {
Group{
BugSplitView()
ShowBugView()
}
}
}
问题是按钮被声明为computed属性。要解决崩溃问题,请按以下方式声明它们:
var buttons = [BugButtonBar.Info(title: "title", imageName: "text.insert"){}]
.onDisappear(perform: {
withAnimation(.easeInOut) {
self.action.collageWidthSize = 2.0 /* modifies next view border */
}
})
结果发现问题出在struct Info的id属性上。将其更改为计算属性,如下所示:
var id : String {
title + imageName
}
我喜欢/讨厌SwiftUI的一个很好的例子。对我来说,这是导航栏标题中的显示模式。删除它可以解决此问题
撞车
无碰撞
.navigationBarTitle("Title")
既然这个无法直接调试的错误似乎是由许多不同的问题引起的,我想我也应该把我的案例放在这里
就我而言,我得到的错误是:
前提条件失败:属性未能设置初始值-128
问题是,我试图在VStack上呈现一张包含NavigationView的工作表,如下所示:
var主体:一些视图{
VStack(对齐:。中心){
如果/*某些条件*/{
/*其他一些内容*/
}否则{
导航视图{
/*查看内容*/
}
}
}.sheet(显示:/*绑定值*/){
/*纸张内容*/
}
}
修复方法是确保工作表显示在NavigationView上:
var主体:一些视图{
导航视图{
VStack(对齐:。中心){
如果/*某些条件*/{
/*其他一些内容*/
}否则{
/*查看内容*/
}
}
}.sheet(显示:/*绑定值*/){
/*纸张内容*/
}
}
事后看来,这似乎很明显,但如果能在坠机发生时获得更多信息,那就太好了。我犯了这个错误。在我的例子中,这是由于在if-else语句的两个块中都有一个NavigationView引起的
// bad
if someBool {
NavigationView {
Text("some content")
}
} else {
NavigationView {
Text("different content")
}
}
在我的例子中,它是在视图消失时为绑定属性设置一个值,该属性更改视图,如下所示:
var buttons = [BugButtonBar.Info(title: "title", imageName: "text.insert"){}]
.onDisappear(perform: {
withAnimation(.easeInOut) {
self.action.collageWidthSize = 2.0 /* modifies next view border */
}
})
在下一个视图的onAppear中设置此选项修复了此问题:
.onAppear {
withAnimation(.easeInOut) {
self.action.collageWidthSize = 2.0
}
}
好吧,我被这个咬了一口。代码11.6
我的视图可能有点复杂,但我要做的是,如果用户将视图置于“编辑”模式,所有单元格都会更改其显示方式。当我切换回来时,我似乎是随机地得到了这个错误。我去掉了一个不必要的装订,把它修好了(手指仍然交叉着)。我将布尔绑定传递到一些子视图中,以便它们知道事物处于什么状态以及如何呈现。问题是,它们不需要对布尔值更改做出响应,因为父对象正在被重新绘制,它可以重新创建子对象。不需要通知它们应该更改状态,它们只是被销毁并重新创建。我使用NavigationView
作为TabView
的根目录:
NavigationView {
TabView {
}
}
然后在选项卡中
我也使用了导航视图
,因此由于这个错误。解决方案是只使用一个导航视图
谢谢。我想你的答案和我下面的答案是互补的。由于它是计算出来的,每次新的id都会使swift感到困惑。这种方法的缺点是,操作代码不能引用封闭结构的变量,因为self还不可用。@LuLuGaGa你能解释一下为什么它可以作为一种解决方案吗?在纯swift中,这种更改应该不会影响生成的结构,在SwiftUI中处理这些突变的方式可能存在缺陷。我建议通过SwiftUI下的反馈助手()提交一份bug报告,并使用变通方法,直到我们可以进一步了解。底线:答案是这个问题的合法变通方法,但每次遇到类似的问题时都提交一份bug报告。谢谢!由于某种原因,我只有在启用画外音时才会崩溃,它工作正常。删除displayMode修复了VoiceOver启用时的崩溃。我不知道你是怎么知道的。