首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能在工作表修饰符SwiftUI中使用状态变量吗?

不能在工作表修饰符SwiftUI中使用状态变量吗?
EN

Stack Overflow用户
提问于 2021-10-22 14:09:27
回答 2查看 77关注 0票数 0

当我选择一个单元格时,我只需设置selectedPlayer对象并切换布尔值以显示对话框。

当激活工作表修饰符时,有以下几个问题:

  1. selectedPlayer为零
  2. ,片材改性剂称为4倍
  3. ,纸张为4倍

我做错了什么?我猜身体会重新生成两次,因为我修改了两个状态变量,但是为什么selectedPlayer不正确,为什么修饰符被调用了4次?

代码语言:javascript
复制
struct PlayerListingView: View {

    @State private var selectedPlayer: PlayerEntity?
    @State private var showAddPlayer: Bool = false
    
    var body: some View {
        Section {
            ForEach(players) { player in
                playerCell(player, onSelect: { p in
                    selectedPlayer = p
                    printv("cell selected selectedPlayer: \(selectedPlayer)")
                    showAddPlayer.toggle()
                })
            }
        }
        .sheet(isPresented: $showAddPlayer) {
            printv("selectedPlayer: \(selectedPlayer)")
            EditPlayerView(isPresented: $showAddPlayer, player: selectedPlayer)
        }
    }

结果是:

代码语言:javascript
复制
cell selected selectedPlayer: Optional(<PlayerEntity: 0x600001a46440> (entity: PlayerEntity; id: 0xd30220ea8e2e9274 <x-coredata://3BBD8F8D-C878-4108-80BF-02ADECE684C2/PlayerEntity/p1>; data: {
    email = "my email";
    games = "<relationship fault: 0x60000393f180 'games'>";
    id = "BDB08E37-16B4-4372-9D31-18220405E1B1";
    "name_" = "my name";
    teams = "<relationship fault: 0x60000393f160 'teams'>";
}))
selectedPlayer: nil
selectedPlayer: nil
selectedPlayer: nil
selectedPlayer: nil
2021-10-22 08:59:41.845954-0500 app[75686:6355985] Writing analzed variants.
2021-10-22 08:59:42.447861-0500 app[75686:6355985] [Presentation] Attempt to present <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x7ff21b718230> on <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x7ff1fc007150> (from <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentGS1_VVS_22_VariadicView_Children7ElementVS_24NavigationColumnModifier_GVS_18StyleContextWriterVS_19SidebarStyleContext___: 0x7ff21b70c8e0>) which is already presenting <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x7ff21d323ac0>.
2021-10-22 08:59:42.448226-0500 app[75686:6355985] [Presentation] Attempt to present <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x7ff21b719c80> on <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x7ff1fc007150> (from <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentGS1_VVS_22_VariadicView_Children7ElementVS_24NavigationColumnModifier_GVS_18StyleContextWriterVS_19SidebarStyleContext___: 0x7ff21b70c8e0>) which is already presenting <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x7ff21d323ac0>.
2021-10-22 08:59:42.448574-0500 app[75686:6355985] [Presentation] Attempt to present <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x7ff21d326920> on <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x7ff1fc007150> (from <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentGS1_VVS_22_VariadicView_Children7ElementVS_24NavigationColumnModifier_GVS_18StyleContextWriterVS_19SidebarStyleContext___: 0x7ff21b70c8e0>) which is already presenting <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x7ff21d323ac0>.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-22 14:21:55

您可以通过切换布尔值来呈现工作表。

代码语言:javascript
复制
func sheet<Content>(isPresented: Binding<Bool>,...

或者通过选择一项

代码语言:javascript
复制
func sheet<Item, Content>(item: Binding<Item?>,...

但不是同时发生的。如果要继续进行所选项,请只使用(后一种形式的)并删除Bool

代码语言:javascript
复制
struct PlayerListingView: View {

    @State private var selectedPlayer: PlayerEntity?
    
    var body: some View {
        Section {
            ForEach(players) { player in
                playerCell(player, onSelect: { p in
                    selectedPlayer = p
                    printv("cell selected selectedPlayer: \(selectedPlayer)")
                  
                })
            }
        }
        .sheet(item: $selectedPlayer) {
            printv("selectedPlayer: \(selectedPlayer)")
            EditPlayerView(player: selectedPlayer)
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2021-10-25 13:11:07

最后,基于@vadian的反馈,我做了这样的事情:

代码语言:javascript
复制
struct PlayerListingView: View {
    @FetchRequest var players: FetchedResults<PlayerEntity>

    @Environment(\.managedObjectContext) private var managedObjectContext

    @State private var selectedPlayer: PlayerEntity?
    @State private var showAddPlayer: Bool = false

    init() {
        _players = FetchRequest(fetchRequest: PlayerEntity.fetchRequestWithPredicate())
    }
    
    var body: some View {
        Section(header) {
            ForEach(players) { player in
                playerCell(player, onSelect: { p in
                    selectedPlayer = p
                })
            }
        }
        .sheet(item: $selectedPlayer) { item in
            EditPlayerView(player: item) {
                selectedPlayer = nil
            }
        }
        .sheet(isPresented: $showAddPlayer) {
            EditPlayerView(player: nil) {
                showAddPlayer.toggle()
            }
        }
    }

    ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69678322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档