Post

Replies

Boosts

Views

Activity

Crash in Preview (but not in Simulator) when using fileprivate on a protocol in Swift
Consider this stripped-down example of a view with a view model: import Observation import SwiftUI struct MainView: View { @State private var viewModel = ViewModel() private let items = [0, 1, 2] var body: some View { List { GroupedItemsView( viewModel : viewModel.groupState, groupedItems : [(0, items)] ) } } } fileprivate struct GroupedItemsView<ViewModel: GroupsExpandable>: View { let viewModel : ViewModel let groupedItems : [(ViewModel.GroupTag, [Int])] var body: some View { ForEach(groupedItems, id: \.0) { groupTag, items in Text("nothing") } } } fileprivate protocol GroupsExpandable: AnyObject { // HERE associatedtype GroupTag: Hashable } fileprivate final class GroupState<GroupTag: Hashable>: GroupsExpandable {} @Observable fileprivate final class ViewModel { var groupState = GroupState<Int>() } #Preview { MainView() } This compiles and runs fine in the Simulator, but it crashes in the Preview. However, when I remove the fileprivate modifier before GroupsExpandable (see HERE), it also runs in the Preview. What is the reason for this? Bug in Preview? Error on my side somewhere? Thanks. System is Xcode Version 16.3 (16E140) on a MacBook Pro 2018 (Intel) running Sequoia 15.3.2 Devices are iPhone 16 Pro Max with iOS 18.3.1, compiler is set to Swift 6.
1
0
145
Apr ’25
Can sections be moved/reordered within list (via onMove-style dragging)?
Consider the following example of a List view containing sections of rows. import SwiftUI struct ListSectionView: View { @State private var sectionHeaders = ["section1", "section2", "section3"] var body: some View { List { ForEach(sectionHeaders, id: \.self) { sectionHeader in Section(header: Text(sectionHeader)) { Text("1") Text("2") Text("3") } } .onMove { indices, newOffset in // ... } } } } I would like to reorder the sections within the list by dragging the respective section header to its new position in the list - similar to moving individual rows via onMove-dragging but with the sections instead of the rows. The above approach does not work. It "activates" moving the rows and then the .onMove code acts on those. The sections themselves are not moved. How can I move/reorder the sections within the list? Thanks.
1
0
186
Apr ’25
Crash in Preview (but not in Simulator) when using fileprivate on a protocol in Swift
Consider this stripped-down example of a view with a view model: import Observation import SwiftUI struct MainView: View { @State private var viewModel = ViewModel() private let items = [0, 1, 2] var body: some View { List { GroupedItemsView( viewModel : viewModel.groupState, groupedItems : [(0, items)] ) } } } fileprivate struct GroupedItemsView<ViewModel: GroupsExpandable>: View { let viewModel : ViewModel let groupedItems : [(ViewModel.GroupTag, [Int])] var body: some View { ForEach(groupedItems, id: \.0) { groupTag, items in Text("nothing") } } } fileprivate protocol GroupsExpandable: AnyObject { // HERE associatedtype GroupTag: Hashable } fileprivate final class GroupState<GroupTag: Hashable>: GroupsExpandable {} @Observable fileprivate final class ViewModel { var groupState = GroupState<Int>() } #Preview { MainView() } This compiles and runs fine in the Simulator, but it crashes in the Preview. However, when I remove the fileprivate modifier before GroupsExpandable (see HERE), it also runs in the Preview. What is the reason for this? Bug in Preview? Error on my side somewhere? Thanks. System is Xcode Version 16.3 (16E140) on a MacBook Pro 2018 (Intel) running Sequoia 15.3.2 Devices are iPhone 16 Pro Max with iOS 18.3.1, compiler is set to Swift 6.
Replies
1
Boosts
0
Views
145
Activity
Apr ’25
Can sections be moved/reordered within list (via onMove-style dragging)?
Consider the following example of a List view containing sections of rows. import SwiftUI struct ListSectionView: View { @State private var sectionHeaders = ["section1", "section2", "section3"] var body: some View { List { ForEach(sectionHeaders, id: \.self) { sectionHeader in Section(header: Text(sectionHeader)) { Text("1") Text("2") Text("3") } } .onMove { indices, newOffset in // ... } } } } I would like to reorder the sections within the list by dragging the respective section header to its new position in the list - similar to moving individual rows via onMove-dragging but with the sections instead of the rows. The above approach does not work. It "activates" moving the rows and then the .onMove code acts on those. The sections themselves are not moved. How can I move/reorder the sections within the list? Thanks.
Replies
1
Boosts
0
Views
186
Activity
Apr ’25