I ran into this with a more complex project, but was able to recreate with a very simple example below. I have a List with five items in it. I use a ForEach on the items with .onMove. The onMove function has a destination value.
If my list is: A, B, C, D, E, and I drag B so it is below C, I would expect to get A, C, B, D, E. Further, I would expect that destination would be 2, since I am moving B to the 3rd index, assuming that A is at index 0.
Weirdly, destination is always 3.
Conversely, if I do the opposite, and drag C so it is above B, and I get A, C, B, D, E, destination is now 1! This makes sense, since it's the second position.
So why is it that moving down the list results in what appears to be 1-based indexing, but moving it up the list seems to be 0-based indexing? How am I supposed to reliably get the correct destination value?
@State var items = ["A", "B", "C", "D", "E"]
var body: some View {
NavigationStack {
List {
ForEach(items, id: \.self) { item in
Text(item)
}
.onMove(perform: moveItem)
}
.toolbar {
ToolbarItem {
EditButton()
}
}
}
}
private func moveItem(from source: IndexSet, to destination: Int) {
print("destination is \(destination)")
}
}
Output from above. If I drag B below C:
destination is 3
If I drag C above B:
destination is 1
Post
Replies
Boosts
Views
Activity
I am using an AVQueuePlayer to play a series of audio files. While implementing the now playing functionality for the iOS lock screen, I got a little confused with how to use MPNowPlayingInfo. When you update MPNowPlayingInfo, one of the fields is MPNowPlayingInfoPropertyElapsedPlaybackTime. This leads me to believe you need to call it at least once a second to keep that up-to-date.
But if you don't call it that frequently, the Now Playing UI does update correctly as it's playing, so that makes me think you only need to call it once you start playing?
It feels very expensive to keep on calling it every time in my periodic time observer, but is that the correct approach? Or do you just call it when you play/pause/skip, etc. ?
I have a few apps that use Core Data & CloudKit to sync data to multiple devices. Everything was fine until I updated to Xcode 14. Now, although the apps work on an actual device, in the simulator, I get errors about "Failed to sync user keys" and it won't sync anything.
I haven't changed the code at all. It just suddenly won't work in the simulator. Since it does this for all apps, I have to believe it's something changed with the simulator?
2022-09-13 12:47:26.766223-0400 Time Since[8061:88974] [error] error: CoreData+CloudKit: -[NSCloudKitMirroringDelegate _performSetupRequest:]_block_invoke(1134): <NSCloudKitMirroringDelegate: 0x600003b540e0>: Failed to set up CloudKit integration for store: <NSSQLCore: 0x1219071d0> (URL: file:///Users/jon/Library/Developer/CoreSimulator/Devices/1990772E-CDF1-4A58-B454-E09D327B2182/data/Containers/Data/Application/3314EA95-4D86-4053-84B3-F1523A57E204/Library/Application%20Support/TimeSince.sqlite)
<CKError 0x600000cc1e60: "Partial Failure" (2/1011); "Failed to modify some record zones"; partial errors: {
com.apple.coredata.cloudkit.zone:__defaultOwner__ = <CKError 0x600000cc2160: "Internal Error" (1/5000); "Failed to sync user keys">
}>
Trying to submit my app to TestFlight. I am getting stuck with a missing private key error. What's weird is that the private key does exist. I can see it in KeyChain. I've only ever used one Mac for development, so it's not like I need to get it form another machine.
I tried revoking the cert, and deleting all the Apple Distribution certs/keys from my Keychain. Then I went through the Distribute App process again. Xcode offered to generate a distribution cert for me. I did that. It appears to have created two of them? One looks normal, but the second one is grayed out and says "Not in keychain".
The "missing private key" error says I have one Apple Distribution certificate but its private key is not installed. Contact the creator of this certificate to get a copy of the private key.
I've looked at a bunch of discussion posts and StackOverflow posts about this, but nothing seems to apply to my specific issue. At least, I tried all those techniques and nothing seems to work.
How do I get around this?
I'm building a CloudKit app, and I'm trying to get a subscription working for the iOS app. Subscriptions work in the web app. This code gives me a "Request failed with http status code 503".
myContainerId is the container ID in CloudKit Dashboard.
				let predicate = NSPredicate(value: true)
				let subscription = CKQuerySubscription(recordType: "Task", predicate: predicate, subscriptionID: "ios-tasks", options: [ CKQuerySubscription.Options.firesOnRecordCreation, CKQuerySubscription.Options.firesOnRecordUpdate, CKQuerySubscription.Options.firesOnRecordDeletion])
				subscription.zoneID = CKRecordZone.ID(zoneName: "com.apple.coredata.cloudkit.zone", ownerName: CKCurrentUserDefaultName)
				let info = CKSubscription.NotificationInfo()
				info.shouldSendContentAvailable = true
				subscription.notificationInfo = info
				
				let aContainer = CKContainer(identifier: myContainerId)
				
				let operation = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: [])
				operation.modifySubscriptionsCompletionBlock = { (sub, subIds, error) in
						guard error == nil else {
								if let error = error {
										print("error while saving subscription: \(error.localizedDescription)")
								}
								return
						}
						
						print("Saved subscription!")
				}
				
				operation.qualityOfService = .utility
				aContainer.privateCloudDatabase.add(operation)
I'm primarily using an NSFetchedResultsController, and that's working great. When I go to CloudKit Dashboard, I see entities stored in my private database under the com.apple.coredata.cloudkit.zone zone.
I'm guessing this is a configuration issue or something?
I'm trying to update an existing record. I have a record I got back from a previous query. It has a valid recordName, and recordChangeTag. When I pass that record to either
newRecordsBatch().update
or
saveRecords
I get the error in the subject.
I ran across an old post from 4 years ago that said something about defining the ZoneID on the record, but I already have that defined from the query. It's using com.apple.coredata.cloudkit.zone.
Xcode 11.3.1 on Mojave. Everything was fine until about half an hour ago when the delete key on my keyboard suddenly stopped working. It works in other apps, just not Xcode. It's the built-in keyboard on the MBP. Tried quitting and restarting Xcode, rebooting the Mac. It's really bizarre. When I hit delete, nothing happens, but then I will get a mesage that there is an invalid character in source file. If I click that, it offers to replace '' wtih ' '.I copied the text into BBEdit and looked at it, and it appears it's inserting ASCII 0x08, which is backspace. Cmd-delete will delete the line, and option-delete will delete the word. It's really hard to code with no delete key!