├── ListPagination.gif
├── Shared
├── Assets.xcassets
│ ├── Contents.json
│ ├── AccentColor.colorset
│ │ └── Contents.json
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── SwiftUI_List_PaginationApp.swift
├── ContentView.swift
├── Extensions
│ └── String+Identifiable.swift
└── Views
│ ├── ListPaginationExampleView.swift
│ └── ListPaginationThresholdExampleView.swift
├── SwiftUI-List-Pagination.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
├── xcuserdata
│ └── crelies.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
└── project.pbxproj
├── SwiftUI-List-Pagination.entitlements
├── README.md
├── LICENSE
└── iOS
└── Info.plist
/ListPagination.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chris-swift-dev/List-Pagination-SwiftUI/HEAD/ListPagination.gif
--------------------------------------------------------------------------------
/Shared/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Shared/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/SwiftUI-List-Pagination.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/SwiftUI-List-Pagination.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/SwiftUI-List-Pagination.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.network.client
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Shared/SwiftUI_List_PaginationApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftUI_List_PaginationApp.swift
3 | // Shared
4 | //
5 | // Created by Christian Elies on 03.08.20.
6 | // Copyright © 2020 Christian Elies. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | @main
12 | struct SwiftUI_List_PaginationApp: App {
13 | var body: some Scene {
14 | WindowGroup {
15 | ContentView()
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/SwiftUI-List-Pagination.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "ListPagination",
6 | "repositoryURL": "https://github.com/crelies/ListPagination",
7 | "state": {
8 | "branch": null,
9 | "revision": "1557cfe6508f5ea7361dbec8be6d27a2392a4015",
10 | "version": "0.1.0"
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # List-Pagination-SwiftUI
2 |
3 | Easily implement pagination support for your SwiftUI lists
4 |
5 | This repository contains a usage example of my Swift package [ListPagination](https://github.com/crelies/ListPagination).
6 |
7 | ## Motivation
8 |
9 | In my latest SwiftUI example project I needed pagination support for the SwiftUI list view.
10 |
11 | ## Preview
12 |
13 | 
14 |
--------------------------------------------------------------------------------
/SwiftUI-List-Pagination.xcodeproj/xcuserdata/crelies.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | SwiftUI-List-Pagination (iOS).xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 1
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Shared/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // SwiftUI-List-Pagination
4 | //
5 | // Created by Christian Elies on 04.08.19.
6 | // Copyright © 2019 Christian Elies. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct ContentView: View {
12 | var body: some View {
13 | ListPaginationExampleView()
14 | }
15 | }
16 |
17 | #if DEBUG
18 | struct ContentView_Previews: PreviewProvider {
19 | static var previews: some View {
20 | ContentView()
21 | }
22 | }
23 | #endif
24 |
--------------------------------------------------------------------------------
/Shared/Extensions/String+Identifiable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Identifiable.swift
3 | // SwiftUI-List-Pagination
4 | //
5 | // Created by Christian Elies on 04.08.19.
6 | // Copyright © 2019 Christian Elies. All rights reserved.
7 | //
8 |
9 | /*
10 | If you want to display an array of strings
11 | in the List view you have to specify a key path,
12 | so each string can be uniquely identified.
13 | With this extension you don't have to do that anymore.
14 | */
15 | extension String: Identifiable {
16 | public var id: String {
17 | return self
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Christian Elies
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 |
28 | UIApplicationSupportsIndirectInputEvents
29 |
30 | UILaunchScreen
31 |
32 | UIRequiredDeviceCapabilities
33 |
34 | armv7
35 |
36 | UISupportedInterfaceOrientations
37 |
38 | UIInterfaceOrientationPortrait
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UISupportedInterfaceOrientations~ipad
43 |
44 | UIInterfaceOrientationPortrait
45 | UIInterfaceOrientationPortraitUpsideDown
46 | UIInterfaceOrientationLandscapeLeft
47 | UIInterfaceOrientationLandscapeRight
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/Shared/Views/ListPaginationExampleView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ListPaginationExampleView.swift
3 | // SwiftUI-List-Pagination
4 | //
5 | // Created by Christian Elies on 03.08.19.
6 | // Copyright © 2019 Christian Elies. All rights reserved.
7 | //
8 |
9 | import ListPagination
10 | import SwiftUI
11 |
12 | struct ListPaginationExampleView: View {
13 | @State private var items: [String] = Array(0...24).map { "Item \($0)" }
14 | @State private var isLoading: Bool = false
15 | @State private var page: Int = 0
16 |
17 | private let pageSize: Int = 25
18 |
19 | var body: some View {
20 | NavigationView {
21 | List(items) { item in
22 | VStack(alignment: .leading) {
23 | Text(item)
24 |
25 | if isLoading && items.isLastItem(item) {
26 | Divider()
27 | ProgressView()
28 | }
29 | }.onAppear {
30 | listItemAppears(item)
31 | }
32 | }
33 | .navigationTitle("List of items")
34 | .toolbar {
35 | ToolbarItem {
36 | Text("Page index: \(page)")
37 | }
38 | }
39 | }
40 | }
41 | }
42 |
43 | private extension ListPaginationExampleView {
44 | func listItemAppears(_ item: Item) {
45 | if items.isLastItem(item) {
46 | isLoading = true
47 |
48 | /*
49 | Simulated async behaviour:
50 | Creates items for the next page and
51 | appends them to the list after a short delay
52 | */
53 | DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
54 | page += 1
55 | let moreItems = getMoreItems(forPage: page, pageSize: pageSize)
56 | items.append(contentsOf: moreItems)
57 | isLoading = false
58 | }
59 | }
60 | }
61 | }
62 |
63 | private extension ListPaginationExampleView {
64 | /*
65 | In a real app you would probably fetch data
66 | from an external API.
67 | */
68 | func getMoreItems(
69 | forPage page: Int,
70 | pageSize: Int
71 | ) -> [String] {
72 | let maximum = ((page * pageSize) + pageSize) - 1
73 | let moreItems: [String] = Array(items.count...maximum).map { "Item \($0)" }
74 | return moreItems
75 | }
76 | }
77 |
78 | #if DEBUG
79 | struct ListPaginationExampleView_Previews: PreviewProvider {
80 | static var previews: some View {
81 | ListPaginationExampleView()
82 | }
83 | }
84 | #endif
85 |
--------------------------------------------------------------------------------
/Shared/Views/ListPaginationThresholdExampleView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ListPaginationThresholdExampleView.swift
3 | // SwiftUI-List-Pagination
4 | //
5 | // Created by Christian Elies on 05.08.19.
6 | // Copyright © 2019 Christian Elies. All rights reserved.
7 | //
8 |
9 | import ListPagination
10 | import SwiftUI
11 |
12 | struct ListPaginationThresholdExampleView: View {
13 | @State private var items: [String] = Array(0...24).map { "Item \($0)" }
14 | @State private var isLoading: Bool = false
15 | @State private var page: Int = 0
16 | private let pageSize: Int = 25
17 | private let offset: Int = 10
18 |
19 | var body: some View {
20 | NavigationView {
21 | List(items) { item in
22 | VStack(alignment: .leading) {
23 | Text(item)
24 |
25 | if isLoading && items.isLastItem(item) {
26 | Divider()
27 | ProgressView()
28 | }
29 | }.onAppear {
30 | listItemAppears(item)
31 | }
32 | }
33 | .navigationTitle("List of items")
34 | .toolbar {
35 | ToolbarItem {
36 | Text("Page index: \(page)")
37 | }
38 | }
39 | }
40 | }
41 | }
42 |
43 | private extension ListPaginationThresholdExampleView {
44 | func listItemAppears(_ item: Item) {
45 | if items.isThresholdItem(
46 | offset: offset,
47 | item: item
48 | ) {
49 | isLoading = true
50 |
51 | /*
52 | Simulated async behaviour:
53 | Creates items for the next page and
54 | appends them to the list after a short delay
55 | */
56 | DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) {
57 | page += 1
58 | let moreItems = getMoreItems(forPage: page, pageSize: pageSize)
59 | items.append(contentsOf: moreItems)
60 | isLoading = false
61 | }
62 | }
63 | }
64 | }
65 |
66 | private extension ListPaginationThresholdExampleView {
67 | /*
68 | In a real app you would probably fetch data
69 | from an external API.
70 | */
71 | func getMoreItems(
72 | forPage page: Int,
73 | pageSize: Int
74 | ) -> [String] {
75 | let maximum = ((page * pageSize) + pageSize) - 1
76 | let moreItems: [String] = Array(items.count...maximum).map { "Item \($0)" }
77 | return moreItems
78 | }
79 | }
80 |
81 | #if DEBUG
82 | struct ListPaginationThresholdExampleView_Previews: PreviewProvider {
83 | static var previews: some View {
84 | ListPaginationThresholdExampleView()
85 | }
86 | }
87 | #endif
88 |
--------------------------------------------------------------------------------
/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | },
93 | {
94 | "idiom" : "mac",
95 | "scale" : "1x",
96 | "size" : "16x16"
97 | },
98 | {
99 | "idiom" : "mac",
100 | "scale" : "2x",
101 | "size" : "16x16"
102 | },
103 | {
104 | "idiom" : "mac",
105 | "scale" : "1x",
106 | "size" : "32x32"
107 | },
108 | {
109 | "idiom" : "mac",
110 | "scale" : "2x",
111 | "size" : "32x32"
112 | },
113 | {
114 | "idiom" : "mac",
115 | "scale" : "1x",
116 | "size" : "128x128"
117 | },
118 | {
119 | "idiom" : "mac",
120 | "scale" : "2x",
121 | "size" : "128x128"
122 | },
123 | {
124 | "idiom" : "mac",
125 | "scale" : "1x",
126 | "size" : "256x256"
127 | },
128 | {
129 | "idiom" : "mac",
130 | "scale" : "2x",
131 | "size" : "256x256"
132 | },
133 | {
134 | "idiom" : "mac",
135 | "scale" : "1x",
136 | "size" : "512x512"
137 | },
138 | {
139 | "idiom" : "mac",
140 | "scale" : "2x",
141 | "size" : "512x512"
142 | }
143 | ],
144 | "info" : {
145 | "author" : "xcode",
146 | "version" : 1
147 | }
148 | }
149 |
--------------------------------------------------------------------------------
/SwiftUI-List-Pagination.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 52;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | B944336524D8AA69000A7914 /* SwiftUI_List_PaginationApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B944335324D8AA68000A7914 /* SwiftUI_List_PaginationApp.swift */; };
11 | B944336924D8AA69000A7914 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B944335524D8AA69000A7914 /* Assets.xcassets */; };
12 | B944337124D8AAE4000A7914 /* String+Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9DFF74F22F7881500002DA4 /* String+Identifiable.swift */; };
13 | B944337324D8AAF9000A7914 /* ListPaginationExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9DFF74C22F7871C00002DA4 /* ListPaginationExampleView.swift */; };
14 | B944337524D8AAFC000A7914 /* ListPaginationThresholdExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9DFF75622F84B3300002DA4 /* ListPaginationThresholdExampleView.swift */; };
15 | B944337724D8ABB3000A7914 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9DFF73C22F7870800002DA4 /* ContentView.swift */; };
16 | B944337A24D8ABBE000A7914 /* ListPagination in Frameworks */ = {isa = PBXBuildFile; productRef = B944337924D8ABBE000A7914 /* ListPagination */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXFileReference section */
20 | B916B79B24D8AD1F00D1E0AB /* SwiftUI-List-Pagination.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "SwiftUI-List-Pagination.entitlements"; sourceTree = ""; };
21 | B944335324D8AA68000A7914 /* SwiftUI_List_PaginationApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUI_List_PaginationApp.swift; sourceTree = ""; };
22 | B944335524D8AA69000A7914 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
23 | B944335A24D8AA69000A7914 /* SwiftUI-List-Pagination.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SwiftUI-List-Pagination.app"; sourceTree = BUILT_PRODUCTS_DIR; };
24 | B944335C24D8AA69000A7914 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
25 | B9DFF73C22F7870800002DA4 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
26 | B9DFF74C22F7871C00002DA4 /* ListPaginationExampleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListPaginationExampleView.swift; sourceTree = ""; };
27 | B9DFF74F22F7881500002DA4 /* String+Identifiable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Identifiable.swift"; sourceTree = ""; };
28 | B9DFF75422F8180500002DA4 /* ListPagination.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = ListPagination.gif; sourceTree = ""; };
29 | B9DFF75522F8183600002DA4 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
30 | B9DFF75622F84B3300002DA4 /* ListPaginationThresholdExampleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListPaginationThresholdExampleView.swift; sourceTree = ""; };
31 | /* End PBXFileReference section */
32 |
33 | /* Begin PBXFrameworksBuildPhase section */
34 | B944335724D8AA69000A7914 /* Frameworks */ = {
35 | isa = PBXFrameworksBuildPhase;
36 | buildActionMask = 2147483647;
37 | files = (
38 | B944337A24D8ABBE000A7914 /* ListPagination in Frameworks */,
39 | );
40 | runOnlyForDeploymentPostprocessing = 0;
41 | };
42 | /* End PBXFrameworksBuildPhase section */
43 |
44 | /* Begin PBXGroup section */
45 | B944335224D8AA68000A7914 /* Shared */ = {
46 | isa = PBXGroup;
47 | children = (
48 | B9DFF73C22F7870800002DA4 /* ContentView.swift */,
49 | B944335324D8AA68000A7914 /* SwiftUI_List_PaginationApp.swift */,
50 | B944335524D8AA69000A7914 /* Assets.xcassets */,
51 | B9DFF74E22F7880400002DA4 /* Extensions */,
52 | B9DFF75322F788B800002DA4 /* Views */,
53 | );
54 | path = Shared;
55 | sourceTree = "";
56 | };
57 | B944335B24D8AA69000A7914 /* iOS */ = {
58 | isa = PBXGroup;
59 | children = (
60 | B944335C24D8AA69000A7914 /* Info.plist */,
61 | );
62 | path = iOS;
63 | sourceTree = "";
64 | };
65 | B9CA805C23053EC8004460BF /* Frameworks */ = {
66 | isa = PBXGroup;
67 | children = (
68 | );
69 | name = Frameworks;
70 | sourceTree = "";
71 | };
72 | B9DFF72C22F7870800002DA4 = {
73 | isa = PBXGroup;
74 | children = (
75 | B916B79B24D8AD1F00D1E0AB /* SwiftUI-List-Pagination.entitlements */,
76 | B9DFF75422F8180500002DA4 /* ListPagination.gif */,
77 | B9DFF75522F8183600002DA4 /* README.md */,
78 | B944335224D8AA68000A7914 /* Shared */,
79 | B944335B24D8AA69000A7914 /* iOS */,
80 | B9DFF73622F7870800002DA4 /* Products */,
81 | B9CA805C23053EC8004460BF /* Frameworks */,
82 | );
83 | sourceTree = "";
84 | };
85 | B9DFF73622F7870800002DA4 /* Products */ = {
86 | isa = PBXGroup;
87 | children = (
88 | B944335A24D8AA69000A7914 /* SwiftUI-List-Pagination.app */,
89 | );
90 | name = Products;
91 | sourceTree = "";
92 | };
93 | B9DFF74E22F7880400002DA4 /* Extensions */ = {
94 | isa = PBXGroup;
95 | children = (
96 | B9DFF74F22F7881500002DA4 /* String+Identifiable.swift */,
97 | );
98 | path = Extensions;
99 | sourceTree = "";
100 | };
101 | B9DFF75322F788B800002DA4 /* Views */ = {
102 | isa = PBXGroup;
103 | children = (
104 | B9DFF74C22F7871C00002DA4 /* ListPaginationExampleView.swift */,
105 | B9DFF75622F84B3300002DA4 /* ListPaginationThresholdExampleView.swift */,
106 | );
107 | path = Views;
108 | sourceTree = "";
109 | };
110 | /* End PBXGroup section */
111 |
112 | /* Begin PBXNativeTarget section */
113 | B944335924D8AA69000A7914 /* SwiftUI-List-Pagination (iOS) */ = {
114 | isa = PBXNativeTarget;
115 | buildConfigurationList = B944336B24D8AA69000A7914 /* Build configuration list for PBXNativeTarget "SwiftUI-List-Pagination (iOS)" */;
116 | buildPhases = (
117 | B944335624D8AA69000A7914 /* Sources */,
118 | B944335724D8AA69000A7914 /* Frameworks */,
119 | B944335824D8AA69000A7914 /* Resources */,
120 | );
121 | buildRules = (
122 | );
123 | dependencies = (
124 | );
125 | name = "SwiftUI-List-Pagination (iOS)";
126 | packageProductDependencies = (
127 | B944337924D8ABBE000A7914 /* ListPagination */,
128 | );
129 | productName = "SwiftUI-List-Pagination (iOS)";
130 | productReference = B944335A24D8AA69000A7914 /* SwiftUI-List-Pagination.app */;
131 | productType = "com.apple.product-type.application";
132 | };
133 | /* End PBXNativeTarget section */
134 |
135 | /* Begin PBXProject section */
136 | B9DFF72D22F7870800002DA4 /* Project object */ = {
137 | isa = PBXProject;
138 | attributes = {
139 | LastSwiftUpdateCheck = 1200;
140 | LastUpgradeCheck = 1100;
141 | ORGANIZATIONNAME = "Christian Elies";
142 | TargetAttributes = {
143 | B944335924D8AA69000A7914 = {
144 | CreatedOnToolsVersion = 12.0;
145 | };
146 | };
147 | };
148 | buildConfigurationList = B9DFF73022F7870800002DA4 /* Build configuration list for PBXProject "SwiftUI-List-Pagination" */;
149 | compatibilityVersion = "Xcode 9.3";
150 | developmentRegion = en;
151 | hasScannedForEncodings = 0;
152 | knownRegions = (
153 | en,
154 | Base,
155 | );
156 | mainGroup = B9DFF72C22F7870800002DA4;
157 | packageReferences = (
158 | B9CA805F230543F3004460BF /* XCRemoteSwiftPackageReference "ListPagination" */,
159 | );
160 | productRefGroup = B9DFF73622F7870800002DA4 /* Products */;
161 | projectDirPath = "";
162 | projectRoot = "";
163 | targets = (
164 | B944335924D8AA69000A7914 /* SwiftUI-List-Pagination (iOS) */,
165 | );
166 | };
167 | /* End PBXProject section */
168 |
169 | /* Begin PBXResourcesBuildPhase section */
170 | B944335824D8AA69000A7914 /* Resources */ = {
171 | isa = PBXResourcesBuildPhase;
172 | buildActionMask = 2147483647;
173 | files = (
174 | B944336924D8AA69000A7914 /* Assets.xcassets in Resources */,
175 | );
176 | runOnlyForDeploymentPostprocessing = 0;
177 | };
178 | /* End PBXResourcesBuildPhase section */
179 |
180 | /* Begin PBXSourcesBuildPhase section */
181 | B944335624D8AA69000A7914 /* Sources */ = {
182 | isa = PBXSourcesBuildPhase;
183 | buildActionMask = 2147483647;
184 | files = (
185 | B944337124D8AAE4000A7914 /* String+Identifiable.swift in Sources */,
186 | B944337724D8ABB3000A7914 /* ContentView.swift in Sources */,
187 | B944337524D8AAFC000A7914 /* ListPaginationThresholdExampleView.swift in Sources */,
188 | B944337324D8AAF9000A7914 /* ListPaginationExampleView.swift in Sources */,
189 | B944336524D8AA69000A7914 /* SwiftUI_List_PaginationApp.swift in Sources */,
190 | );
191 | runOnlyForDeploymentPostprocessing = 0;
192 | };
193 | /* End PBXSourcesBuildPhase section */
194 |
195 | /* Begin XCBuildConfiguration section */
196 | B944336C24D8AA69000A7914 /* Debug */ = {
197 | isa = XCBuildConfiguration;
198 | buildSettings = {
199 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
200 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
201 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
202 | CODE_SIGN_ENTITLEMENTS = "SwiftUI-List-Pagination.entitlements";
203 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
204 | CODE_SIGN_STYLE = Automatic;
205 | ENABLE_PREVIEWS = YES;
206 | INFOPLIST_FILE = iOS/Info.plist;
207 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
208 | LD_RUNPATH_SEARCH_PATHS = (
209 | "$(inherited)",
210 | "@executable_path/Frameworks",
211 | );
212 | PRODUCT_BUNDLE_IDENTIFIER = "de.crelies.SwiftUI-List-Pagination";
213 | PRODUCT_NAME = "SwiftUI-List-Pagination";
214 | SDKROOT = iphoneos;
215 | SUPPORTS_MACCATALYST = YES;
216 | SWIFT_VERSION = 5.0;
217 | TARGETED_DEVICE_FAMILY = "1,2,6";
218 | };
219 | name = Debug;
220 | };
221 | B944336D24D8AA69000A7914 /* Release */ = {
222 | isa = XCBuildConfiguration;
223 | buildSettings = {
224 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
225 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
226 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
227 | CODE_SIGN_ENTITLEMENTS = "SwiftUI-List-Pagination.entitlements";
228 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
229 | CODE_SIGN_STYLE = Automatic;
230 | ENABLE_PREVIEWS = YES;
231 | INFOPLIST_FILE = iOS/Info.plist;
232 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
233 | LD_RUNPATH_SEARCH_PATHS = (
234 | "$(inherited)",
235 | "@executable_path/Frameworks",
236 | );
237 | PRODUCT_BUNDLE_IDENTIFIER = "de.crelies.SwiftUI-List-Pagination";
238 | PRODUCT_NAME = "SwiftUI-List-Pagination";
239 | SDKROOT = iphoneos;
240 | SUPPORTS_MACCATALYST = YES;
241 | SWIFT_VERSION = 5.0;
242 | TARGETED_DEVICE_FAMILY = "1,2,6";
243 | VALIDATE_PRODUCT = YES;
244 | };
245 | name = Release;
246 | };
247 | B9DFF74722F7870C00002DA4 /* Debug */ = {
248 | isa = XCBuildConfiguration;
249 | buildSettings = {
250 | ALWAYS_SEARCH_USER_PATHS = NO;
251 | CLANG_ANALYZER_NONNULL = YES;
252 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
253 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
254 | CLANG_CXX_LIBRARY = "libc++";
255 | CLANG_ENABLE_MODULES = YES;
256 | CLANG_ENABLE_OBJC_ARC = YES;
257 | CLANG_ENABLE_OBJC_WEAK = YES;
258 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
259 | CLANG_WARN_BOOL_CONVERSION = YES;
260 | CLANG_WARN_COMMA = YES;
261 | CLANG_WARN_CONSTANT_CONVERSION = YES;
262 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
263 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
264 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
265 | CLANG_WARN_EMPTY_BODY = YES;
266 | CLANG_WARN_ENUM_CONVERSION = YES;
267 | CLANG_WARN_INFINITE_RECURSION = YES;
268 | CLANG_WARN_INT_CONVERSION = YES;
269 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
270 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
271 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
272 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
273 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
274 | CLANG_WARN_STRICT_PROTOTYPES = YES;
275 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
276 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
277 | CLANG_WARN_UNREACHABLE_CODE = YES;
278 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
279 | COPY_PHASE_STRIP = NO;
280 | DEBUG_INFORMATION_FORMAT = dwarf;
281 | ENABLE_STRICT_OBJC_MSGSEND = YES;
282 | ENABLE_TESTABILITY = YES;
283 | GCC_C_LANGUAGE_STANDARD = gnu11;
284 | GCC_DYNAMIC_NO_PIC = NO;
285 | GCC_NO_COMMON_BLOCKS = YES;
286 | GCC_OPTIMIZATION_LEVEL = 0;
287 | GCC_PREPROCESSOR_DEFINITIONS = (
288 | "DEBUG=1",
289 | "$(inherited)",
290 | );
291 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
292 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
293 | GCC_WARN_UNDECLARED_SELECTOR = YES;
294 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
295 | GCC_WARN_UNUSED_FUNCTION = YES;
296 | GCC_WARN_UNUSED_VARIABLE = YES;
297 | IPHONEOS_DEPLOYMENT_TARGET = 13.0;
298 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
299 | MTL_FAST_MATH = YES;
300 | ONLY_ACTIVE_ARCH = YES;
301 | SDKROOT = iphoneos;
302 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
303 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
304 | };
305 | name = Debug;
306 | };
307 | B9DFF74822F7870C00002DA4 /* Release */ = {
308 | isa = XCBuildConfiguration;
309 | buildSettings = {
310 | ALWAYS_SEARCH_USER_PATHS = NO;
311 | CLANG_ANALYZER_NONNULL = YES;
312 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
313 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
314 | CLANG_CXX_LIBRARY = "libc++";
315 | CLANG_ENABLE_MODULES = YES;
316 | CLANG_ENABLE_OBJC_ARC = YES;
317 | CLANG_ENABLE_OBJC_WEAK = YES;
318 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
319 | CLANG_WARN_BOOL_CONVERSION = YES;
320 | CLANG_WARN_COMMA = YES;
321 | CLANG_WARN_CONSTANT_CONVERSION = YES;
322 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
323 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
324 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
325 | CLANG_WARN_EMPTY_BODY = YES;
326 | CLANG_WARN_ENUM_CONVERSION = YES;
327 | CLANG_WARN_INFINITE_RECURSION = YES;
328 | CLANG_WARN_INT_CONVERSION = YES;
329 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
330 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
331 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
332 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
333 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
334 | CLANG_WARN_STRICT_PROTOTYPES = YES;
335 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
336 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
337 | CLANG_WARN_UNREACHABLE_CODE = YES;
338 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
339 | COPY_PHASE_STRIP = NO;
340 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
341 | ENABLE_NS_ASSERTIONS = NO;
342 | ENABLE_STRICT_OBJC_MSGSEND = YES;
343 | GCC_C_LANGUAGE_STANDARD = gnu11;
344 | GCC_NO_COMMON_BLOCKS = YES;
345 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
346 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
347 | GCC_WARN_UNDECLARED_SELECTOR = YES;
348 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
349 | GCC_WARN_UNUSED_FUNCTION = YES;
350 | GCC_WARN_UNUSED_VARIABLE = YES;
351 | IPHONEOS_DEPLOYMENT_TARGET = 13.0;
352 | MTL_ENABLE_DEBUG_INFO = NO;
353 | MTL_FAST_MATH = YES;
354 | SDKROOT = iphoneos;
355 | SWIFT_COMPILATION_MODE = wholemodule;
356 | SWIFT_OPTIMIZATION_LEVEL = "-O";
357 | VALIDATE_PRODUCT = YES;
358 | };
359 | name = Release;
360 | };
361 | /* End XCBuildConfiguration section */
362 |
363 | /* Begin XCConfigurationList section */
364 | B944336B24D8AA69000A7914 /* Build configuration list for PBXNativeTarget "SwiftUI-List-Pagination (iOS)" */ = {
365 | isa = XCConfigurationList;
366 | buildConfigurations = (
367 | B944336C24D8AA69000A7914 /* Debug */,
368 | B944336D24D8AA69000A7914 /* Release */,
369 | );
370 | defaultConfigurationIsVisible = 0;
371 | defaultConfigurationName = Release;
372 | };
373 | B9DFF73022F7870800002DA4 /* Build configuration list for PBXProject "SwiftUI-List-Pagination" */ = {
374 | isa = XCConfigurationList;
375 | buildConfigurations = (
376 | B9DFF74722F7870C00002DA4 /* Debug */,
377 | B9DFF74822F7870C00002DA4 /* Release */,
378 | );
379 | defaultConfigurationIsVisible = 0;
380 | defaultConfigurationName = Release;
381 | };
382 | /* End XCConfigurationList section */
383 |
384 | /* Begin XCRemoteSwiftPackageReference section */
385 | B9CA805F230543F3004460BF /* XCRemoteSwiftPackageReference "ListPagination" */ = {
386 | isa = XCRemoteSwiftPackageReference;
387 | repositoryURL = "https://github.com/crelies/ListPagination";
388 | requirement = {
389 | kind = upToNextMajorVersion;
390 | minimumVersion = 0.1.0;
391 | };
392 | };
393 | /* End XCRemoteSwiftPackageReference section */
394 |
395 | /* Begin XCSwiftPackageProductDependency section */
396 | B944337924D8ABBE000A7914 /* ListPagination */ = {
397 | isa = XCSwiftPackageProductDependency;
398 | package = B9CA805F230543F3004460BF /* XCRemoteSwiftPackageReference "ListPagination" */;
399 | productName = ListPagination;
400 | };
401 | /* End XCSwiftPackageProductDependency section */
402 | };
403 | rootObject = B9DFF72D22F7870800002DA4 /* Project object */;
404 | }
405 |
--------------------------------------------------------------------------------