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

SwiftUI-预览次数太多

冷涵忍
2023-03-14

如何为我的视图只显示1个预览?现在我对一个视图有问题:ItemView.Swift

在我运行ContentView.Swift的实时预览并添加几个核心数据对象之后,我的ItemView.Swift将显示所有对象和测试数据的预览。有很多对象,有很多预览,这大大减慢了Xcode的速度。

我在代码2中标记了可能导致问题的地方。我认为它不是ForEach就是ItemView_Previews结构。我试过修它,但我修不了。

我用的是核心数据。并且有一个实体:Item,一个属性:date。但我认为这不是一个核心数据问题。

ContentView.Swift

import SwiftUI
import CoreData

struct ContentView: View {
    
    @Environment(\.managedObjectContext) var managedObjectContext
    @State var paidFilter :Bool? = nil
    
    
    var body: some View {
        
        NavigationView {
            List {
                
                ItemView(filter: paidFilter)
                
            }
            .listStyle(PlainListStyle())
            .navigationTitle(Text("Items"))
            .navigationBarItems(
                trailing:
                    
                    Button(action: {
                        let item = Item(context: self.managedObjectContext)
                        item.date = Date()
                        
                        do {
                            try self.managedObjectContext.save()
                        }catch{
                            print(error)
                        }
                        
                    }) {
                        Image(systemName: "plus.circle.fill")
                            .font(.title)
                    }
            )
        }
        .navigationViewStyle(StackNavigationViewStyle())
        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        return ContentView()
            .environment(\.managedObjectContext, context)
    }
}

ItemView.Swift

import SwiftUI

struct ItemView: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    var fetchRequest: FetchRequest<Item>
    var items: FetchedResults<Item> { fetchRequest.wrappedValue }
    
    init(filter: Bool?) {
        fetchRequest = FetchRequest<Item>(entity: Item.entity(), sortDescriptors: [])
    }
    
    var body: some View {
        // I think problem is here
        ForEach(items, id: \.self) {item in
            Text("\(item.date ?? Date())")
        }       
    }
}

struct ItemView_Previews: PreviewProvider {
    static var previews: some View {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        //Or problem is here - Test data
        let testItem = Item.init(context: context)
        testItem.date = Date()
        return ItemView(filter: false)
            .environment(\.managedObjectContext, context)
    }
}

共有1个答案

公冶昆杰
2023-03-14

替换

var body: some View {
    // I think problem is here
    ForEach(items, id: \.self) {item in
        Text("\(item.date ?? Date())")
    }       
}

var body: some View {

    /// add VStack here!
    VStack {
        ForEach(items, id: \.self) {item in
            Text("\(item.date ?? Date())")
        }       
    }
}

如果没有VStack或其他容器,您的主体将由多个视图组成。这使得Xcode为它们每一个生成一个预览...类似的问题见这里。

 类似资料:
  • (macOS 10.15 beta 和 Xcode 11 beta 5) 我正在使用的SwiftUI教程(https://www.raywenderlich.com/3715234-swiftui-getting-started#toc-anchor-005)包括以下视图: 该视图是在与另一个视图相同的文件中声明的,可以作为该视图的组件进行预览。 正如在教程中使用的那样,它可以工作,但我后来将视图

  • 接口说明 增加素材预览访问次数 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /wish3dearth/api/material/v1.0.0/addMaterialViewCount 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 token string header 是 当前登录用户的TOKEN mat

  • 接口说明 增加素材预览访问次数 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 POST /wish3dearth/api/material/v1.

  • 我使用Laravel 5.4的项目和场景是,如果没有任何创建然后在登录重定向到页面。 下面是我的路线页编码 目录结构是 下面是我的code 它重定向了太多次,我收到错误消息说。 我在这里做错了什么??

  • preview 用于实现表单预览,类似于微信支付账单之类的。表单预览分为 head(weui-form-preview__hd),body(weui-form-preview__bd)和 foot(weui-form-preview__ft)这三大部分,因此实现这一功能加上weui.css的一些类即可,示例代码如下: <template> <div class="page"> <div

  • SQL 预览 选项卡显示数据库或模式对象的 CREATE 语句及必要的 SQL 语句。 对于一些数据库或模式对象,你可以使用下面的下拉列表来显示当按下 保存 或 另存为 按钮时运行的 SQL。