Post

Replies

Boosts

Views

Activity

UICommand is disabled on UIMenu inside NSMenuToolbarItem.itemMenu on Catalyst
Before beta 4 this worked as expected. After updating to beta 4, all my UICommands inside UIMenu on NSMenuToolbarItem.itemMenu are now disabled, and I can't figure out how to enable them. Here's my itemForItemIdentifier method: func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { 		let item = NSMenuToolbarItem(itemIdentifier: itemIdentifier) 		item.itemMenu = UIMenu(title: "", options: .displayInline, children: [UICommand(title: "Test", action: #selector(onTestTap))]) 		item.image = UIImage(systemName: "ellipsis.circle") 		return item } Am I doing something wrong or is this a bug on macOS Big Sur beta 4?
5
0
2k
Apr ’21
iPad keyboard navigation: where to initialize UIFocusHaloEffect
WWDC21 Session Focus on iPad keyboard navigation says that we can use UIFocusHaloEffect to change the appearance of focused items. On iPadOS, we can use this effect by assigning a UIFocusHaloEffect to the focusEffect property like so: self.focusEffect = UIFocusHaloEffect() What wasn't very clear is where should we put this code when working with UICollectionViewCell. I am doing it in the collectionView(_:canFocusItemAt:) method: func collectionView(_ collectionView: UICollectionView, canFocusItemAt indexPath: IndexPath) -> Bool { guard #available(iOS 15.0, *) else { return false } guard let cell = collectionView.cellForItem(at: indexPath) as? FeedCollectionViewCell else { return false } if cell.focusEffect == nil { cell.focusEffect = UIFocusHaloEffect(roundedRect: cell.artworkImageView.frame, cornerRadius: cell.cornerRadius, curve: .continuous) } return true } Is this the best way to implement it?
1
0
1.1k
Aug ’21
SwiftUI: unexpected behavior with two List side by side and a NavigationView
I have a screen with two List side by side, inside a NavigationView. The layout is rendered correctly, and I can independently scroll both lists. The problem is that, when I scroll the first list, it goes behind the navigation bar without triggering the effect of applying a background color to it. Here's a gif showing what's going on: And this is the code I'm using for this view: struct ContentView: View { var body: some View { NavigationView { HStack(spacing: 0) { List { Section(header: Text("Header left")) { ForEach(0..<600) { integer in Text("\(integer)") } } } .listStyle(InsetGroupedListStyle()) .frame(minWidth: 0, maxWidth: .infinity) List { Section(header: Text("Header right")) { ForEach(0..<400) { integer in Text("\(integer)") } } } .listStyle(InsetGroupedListStyle()) .frame(minWidth: 0, maxWidth: .infinity) } .navigationTitle("Example") } .navigationViewStyle(StackNavigationViewStyle()) } } Would this be a SwiftUI bug? If not, how can I make the first list correctly interact with the navigation bar when scrolling?
0
0
911
Aug ’21
Can't obtain the user's Apple Music token on macOS (Catalyst)
On a macOS app generated with Catalyst, the method SKCloudServiceController.requestUserToken(forDeveloperToken:completionHandler:) returns a SKErrorDomain. The error is: Error Domain=SKErrorDomain Code=0 "Ocorreu um erro desconhecido" UserInfo={NSLocalizedDescription=Ocorreu um erro desconhecido} Has something changed regarding this method on macOS or is this a bug?
9
0
2.3k
Dec ’21
How to reload widgets from the share sheet, via an Action Extension
My app has an action extension that allow users to collect and save links throughout the system. It also has a widget to show these links in the Home Screen. When adding links from the main app, I call WidgetCenter.shared.reloadAllTimelines() to reload all widgets, and everything works as expected. But when I add links from the action extension, widgets are not reloaded, even after calling WidgetCenter.shared.reloadAllTimelines(). Only when I go to the main app is that widgets do reload. How can I refresh my widgets for changes made via the Action Extension from the share sheet?
0
0
863
Dec ’21
SwiftUI view does not update when FetchRequest data changes from inside Action Extension
I'm sharing a Core Data store with my action extension, which adds data to it. My app has a SwiftUI view that presents this data, fetched with a FetchRequest: private struct VideosScrollView: View { @Environment(\.managedObjectContext) private var viewContext private var fetchRequest: FetchRequest<Video> init(sortOrder: String, tagIds: String, showWatched: Bool) { fetchRequest = Video.getFetchRequest(sortingBy: "addDate", with: sortOrder, showWatched: showWatched, tagIds: tagIds) } var body: some View { ScrollView { if fetchRequest.wrappedValue.isEmpty { ContentEmptyView() } else { ForEach(fetchRequest.wrappedValue) { item in VideoCellView(video: item) } } } } } After adding data from the action extension and going back to the app, the view is not updated. Only after CloudKit finished a sync is that the view notices something changed and updates itself. How can I force my SwiftUI view to update when data changes in the action extension?
1
0
1.1k
Dec ’21
Transaction.latest(for:) returns nil in StoreKit 2
Using the Implementing a Store In Your App Using the StoreKit API sample code, I've successfully integrated my new APP with StoreKit 2. There is one problem though: when I call the method Transaction.latest(for:) to get the user’s latest transaction, it always returns nil. Here's the code snippet: guard let result = await Transaction.latest(for: myProductId) else { return false } Is this a bug with StoreKit 2, or am I doing something wrong? This happens on a physical device, running from Xcode. Thanks in advance.
4
0
2.2k
Jan ’22
SwiftUI: How to change List selected item color
iPadOS uses a different selection color when an external keyboard is connected. But the problem is that it doesn't change the text color to white, making it difficult to read: A simple List with NavigationLink produces this behavior by default: var body: some View { List { ForEach(searchResults) { item in NavigationLink(destination: ContentDetailView(item: item)) { ListItemView(item: item) } } } } I tried to improve text legibility by changing all Text colors to white when the cell is selected. But this doesn't work because the text becomes even more unreadable when no external keyboard is connected. Is there a way to change the selection color when an external keyboard is connected? Or maybe detect when an external keyboard is connected to manually change the text color for this specific case?
0
1
1.4k
Mar ’22
macOS SwiftUI Table with contextMenu
Using SwiftUI's new Table container, how can I add a context menu that appears when Control-clicking a row? I can add the contextMenu modifier to the content of the TableColumn, but then I will have to add it to each individual column. And it only works above the specific text, not on the entire row: I tried adding the modifier to the TableColumn itself, but it shows a compile error: Value of type 'TableColumn<RowValue, Never, Text, Text>' has no member 'contextMenu' Here's what I have in terms of source code, with the contextMenu modifier in the content of the TableColumn: struct ContentView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Item.name, ascending: true)]) private var items: FetchedResults<Item> @State private var sortOrder = [KeyPathComparator(\Item.name)] @State private var selection = Set<Item.ID>() var body: some View { NavigationView { Table(items, selection: $selection, sortOrder: $items.sortDescriptors) { TableColumn("Column 1") { Text("Item at \($0.name!)") .contextMenu { Button(action: {}) { Text("Action 1") } Divider() Button(action: {}) { Text("Action 2") } Button(action: {}) { Text("Action 3") } } } TableColumn("Column 2") { Text($0.id.debugDescription) } } .toolbar { ToolbarItem { Button(action: addItem) { Label("Add Item", systemImage: "plus") } } } if selection.isEmpty { Text("Select an item") } else if selection.count == 1 { Text("Selected \(items.first(where: { $0.id == selection.first! })!.id.debugDescription)") } else { Text("Selected \(selection.count)") } } } } So, how can I add a context menu to the entire row inside the Table?
3
0
4.2k
Mar ’22
App Groups capability is not available for Mac Catalyst provisioning profile
I'm trying to build my iOS app to macOS Catalyst. Everything works fine when running locally on my machine via Xcode, but an error occurs when I archive and try to upload to the notarisation service: Cannot create a Mac Catalyst Developer ID provisioning profile for "br.com.marcosatanaka.music-harbor". The App Groups capability is not available for Mac Catalyst Developer ID provisioning profiles. Disable this feature and try again. I have the App Groups capability enabled on my app's target Signing &amp; Capabilities tab on Xcode. But, when I go to the Apple Developer portal under Certificates, Identifiers &amp; Profiles > Profiles and select the Mac Catalyst provisioning profile (automatically generated by Xcode), the App Groups capability is not present on the Enabled Capabilities section. I can work around this issue by removing the com.apple.security.application-groups entitlement when building for Mac Catalyst, but that causes me a runtime error when Core Data tries to access the store located on the shared container. I also need it to be on a shared container because I want to access the database from both the main app and also the new widget extension. How can I add the App Groups capability to my Mac Catalyst provisioning profile?
5
0
15k
Jul ’22
How to sort my Core Data entities using the new query properties from AppIntents
TL;DR How to create an NSSortDescriptor using a PartialKeyPath instead of a KeyPath? Or How to convert a PartialKeyPath to a KeyPath? Details I'm using the new query properties from AppIntents to filter my app's data in Shortcuts, but I'm unable to map the sorting attribute it gives me to the sorting attribute Core Data expects in the predicate. Here's my EntityPropertyQuery implementation: extension ArtistQuery: EntityPropertyQuery { static var sortingOptions = SortingOptions { SortableBy(\ArtistEntity.$name) } static var properties = QueryProperties { Property(\ArtistEntity.$name) { EqualToComparator { NSPredicate(format: "name = %@", $0) } ContainsComparator { NSPredicate(format: "name CONTAINS %@", $0) } } } func entities(matching comparators: [NSPredicate], mode: ComparatorMode, sortedBy: [Sort<ArtistEntity>], limit: Int?) async throws -> [ArtistEntity] { Database.shared.findArtists(matching: comparators, matchAll: mode == .and, sorts: sortedBy.map { NSSortDescriptor(keyPath: $0.by, ascending: $0.order == .ascending) }) } } And my findArtists method is implemented as follows: static func findArtists(matching comparators: [NSPredicate], matchAll: Bool, sorts: [NSSortDescriptor]) -> [EArtist] { ... } As we can see in the entities(matching:) function, I'm using the by attribute from the sortedBy parameter to create the NSSortDescriptor, but it doesn't work because the NSSortDescriptor init expects a KeyPath, not a PartialKeyPath: Cannot convert value of type 'PartialKeyPath<ArtistEntity>' to expected argument type 'KeyPath<Root, Value>' So, can I create an NSSortDescriptor using a PartialKeyPath instead of a KeyPath? Or maybe converting a PartialKeyPath to a KeyPath?
1
1
1.7k
Aug ’22
Shortcuts editor doesn't recognize boolean EntityQueryProperty
My AppEntity has a Bool property, and I would like to query by this property using EntityPropertyQuery. I'm creating an EntityQueryProperty for it with an EqualToComparator as the following (partial code for brevity): // My AppEntity struct AlbumAppEntity: AppEntity, Identifiable { @Property(title: "Hidden") var isHidden: Bool // Other properties } // My EntityPropertyQuery static var properties = QueryProperties { Property(\AlbumAppEntity.$isHidden) { EqualToComparator { isHidden in if isHidden { return NSPredicate(format: "isHidden == YES") } else { return NSCompoundPredicate(type: .or, subpredicates: [NSPredicate(format: "isHidden = nil"), NSPredicate(format: "isHidden == NO")]) } } } } But the problem is that Shortcuts does not recognize it as a boolean parameter in the shortcuts editor. It recognizes it as a numeric field, which returns the error AppIntents.EntityPropertyQueryError error 2 when run: I also tried different NSPredicate, but the result is always the same: Property(\AlbumAppEntity.$isHidden) { EqualToComparator { NSPredicate(format: "isHidden == %d", $0) } } Property(\AlbumAppEntity.$isHidden) { EqualToComparator { NSPredicate(format: "isHidden == %@", NSNumber(value: $0)) } } How can I query using boolean properties in a way that Shortcuts recognizes it and provides appropriate fields in the shortcuts editor?
0
1
1.3k
Aug ’22
Assign a category name to the Find intent generated by EntityPropertyQuery
In an AppIntent we can declare an IntentDescription with a categoryName to group similar intents: struct OpenArtist: AppIntent { static var description: IntentDescription = IntentDescription("Opens a specific artist.", categoryName: "artistsSection") // Additional properties } But how can we assign the same category to the "Find AppEntity" intent generated when we declare an EntityPropertyQuery? I want to group it along with the other intents that handle the same entity, but since it is generated by the system, I don't know how to assign a category to it.
2
2
1.5k
Mar ’23
Opening a Safari URL from an interactive widget with AppIntents
My app allows users to store URLs for future reference. It also has widgets that display these saved items. I want to make these widgets interactive by opening the linked content in Safari without having to open the main app. The issue is that UIApplication.shared.open is not available in app extensions. And this is a problem since widgets are app extensions. Are there alternative methods to accomplish this scenario, or is it currently unsupported?
1
1
1.5k
Jul ’23