工具栏正在删除我在NavigationView中的后退按钮

时间:2020-10-17 17:04:51

标签: swift swiftui

我有一个列表的“详细信息”视图,可以从主视图导航到该列表:

NavigationView {
    ...
    NavigationLink(destination: DetailView()) {
        Text(entity.name ?? "Unknown")
    }
    ...
}

然后在我的DetailView中,我可以看到主视图的后退按钮:

struct DetailView: View {
  
    var body: some View {
        Form {
            ...
        }
        .navigationBarTitle("Deatil")
        /*.toolbar {
            ToolbarItem(placement: .primaryAction) {
                
                Button(action: {
                    ...
                }) {
                    Image(systemName: "ellipsis.circle")
                }
                
            }
            
        }*/
    }
}

一切正常,直到我使用工具栏。然后,我仅看到工具栏,而没有导航到最后一个视图。为什么?通常这应该可行,对吧?

2 个答案:

答案 0 :(得分:1)

public class PrimitiveTypesV2 {

public static void main (String[] args) {
    Class typesList[] = {
            Boolean.class , Byte.class, Character.class, Short.class, Integer.class,
            Long.class, Float.class, Double.class, Boolean.TYPE, Byte.TYPE, Character.TYPE,
            Short.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE
        };
    
    try {               
        for ( Class type : typesList ) {
            if (type.isPrimitive()) {
                System.out.println("Primitive type:\t" + type); 
            }
            else {
                boolean hasSize = false;
                java.lang.reflect.Field fields[] = type.getFields();
                for (int count=0; count<fields.length; count++) {
                    if (fields[count].getName().contains("SIZE")) hasSize = true;
                }
                if (hasSize) {
                    System.out.println("Bits size of type " + type + " :\t\t\t" + type.getField("SIZE").getInt(type) );
                    double value = type.getField("MIN_VALUE").getDouble(type);
                    long longVal = Math.round(value);
                    if ( (value - longVal) == 0) {
                        System.out.println("Min value for type " + type + " :\t\t" + longVal );
                        longVal = Math.round(type.getField("MAX_VALUE").getDouble(type));
                        System.out.println("Max value for type " + type + " :\t\t" + longVal );
                    }
                    else {
                        System.out.println("Min value for type " + type + " :\t\t" + value );
                        value = type.getField("MAX_VALUE").getDouble(type);
                        System.out.println("Max value for type " + type + " :\t\t" + value );
                    }
                }
                else {
                    System.out.println(type + "\t\t\t type without SIZE field.");
                }
            } // if not primitive
        } // for typesList
    } catch (Exception e) {e.printStackTrace();}
} // main
} // class PrimitiveTypes

答案 1 :(得分:1)

我解决了!经过进一步的实验,我发现通过添加以下工具栏项目,可以防止后退按钮在刷新的视图中消失,而不是导航层次结构中深于三个的视图。

ToolbarItem(placement: .navigationBarLeading) {Text("")}

注意:EmptyView()将不起作用。该错误似乎需要在开头的位置处有一个活动的工具栏项,以防止在刷新视图时在层次结构深处的三个或三个以上的视图中后退按钮消失。

正如我之前列出的,当不使用上面建议的新解决方法时,在处理此错误时还需要考虑一些其他警告。

  • navigationBarItems(trailing:)已弃用
  • 使用 navigationBarItems(trailing:)toolbar(content:)在同一 NavigationView层次结构(即使处于不同的视图中)也可以避免 此错误将导致许多视觉故障(重复 按钮等。)
  • 使用toolbar(content:)刷新视图 导航层次结构中 3个深 视图将删除 向后导航(按钮和滑动手势)的能力 层次结构。
  • 其价值,如果您专门指出工具栏项目的trailing位置,并将该项目保留在视图层次结构的前两个视图中,则可以避免使用default / primaryAction或领先的排名以及使用navigationBarItem的情况下,您可以避免大多数此类错误。