当我选择一个单元格时,我只需设置selectedPlayer对象并切换布尔值以显示对话框。
当激活工作表修饰符时,有以下几个问题:
selectedPlayer为零。
我做错了什么?我猜身体会重新生成两次,因为我修改了两个状态变量,但是为什么selectedPlayer不正确,为什么修饰符被调用了4次?
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)
}
}结果是:
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>.发布于 2021-10-22 14:21:55
您可以通过切换布尔值来呈现工作表。
func sheet<Content>(isPresented: Binding<Bool>,...或者通过选择一项
func sheet<Item, Content>(item: Binding<Item?>,...但不是同时发生的。如果要继续进行所选项,请只使用(后一种形式的)并删除Bool
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)
}
}发布于 2021-10-25 13:11:07
最后,基于@vadian的反馈,我做了这样的事情:
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()
}
}
}
...
}https://stackoverflow.com/questions/69678322
复制相似问题