Skip to content

Commit a83e062

Browse files
committed
Implement unremoveItem
1 parent bb60caa commit a83e062

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

Sources/OpenSwiftUICore/Layout/Dynamic/DynamicContainer.swift

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -621,8 +621,37 @@ struct DynamicContainerInfo<Adapter>: StatefulRule, AsyncAttribute, ObservedAttr
621621
}
622622
}
623623

624-
func unremoveItem(at index: Int) {
625-
_openSwiftUIUnimplementedWarning()
624+
mutating func unremoveItem(at index: Int) {
625+
let items = info.items
626+
let phase: TransitionPhase
627+
switch items[index].phase {
628+
case .willAppear, .identity:
629+
items[index].resetSeed &-= 1
630+
phase = .identity
631+
case .didDisappear:
632+
info.removedCount &-= 1
633+
items[index].removalOrder = 0
634+
phase = .identity
635+
case nil:
636+
info.unusedCount &-= 1
637+
let subgraph = items[index].subgraph
638+
parentSubgraph.addChild(subgraph)
639+
subgraph.didReinsert()
640+
phase = .willAppear
641+
}
642+
let newPhase = items[index].needsTransitions ? phase : .identity
643+
items[index].phase = newPhase
644+
guard newPhase == .willAppear else {
645+
return
646+
}
647+
needsPhaseUpdate = true
648+
let weakAsyncSignal = WeakAttribute($asyncSignal)
649+
GraphHost.currentHost.continueTransaction {
650+
guard let asyncSignal = weakAsyncSignal.attribute else {
651+
return
652+
}
653+
asyncSignal.invalidateValue()
654+
}
626655
}
627656

628657
func eraseItem(at index: Int) {

0 commit comments

Comments
 (0)