Post

Replies

Boosts

Views

Activity

macOS 26 Tahoe beta 1 - Cannot login
A few days ago I installed beta 1 of macOS 26 Tahoe on a spare MacBook Pro 14-inch M4. Everything went well, and it looks okay (well, I don't like it at all, but hey-ho), and I shut it down. I started it up today, and it rejects my login password every time, then locks my account. When I click the link to "Restart and show password reset options" I'm asked for my Apple ID details, so I enter the correct email and password, then the MBP reboots and I'm back on the login screen with no indication that anything has changed. Guess I'm stuck now... FB18364657
4
1
645
Sep ’25
List rows disappearing when scrolling
I have a List containing ItemRow views based on an ItemDetails object. The content is provided by a model which pulls it from Core Data. When I scroll through the list one or two of the rows will disappear and reappear when I scroll back up. I have a feeling it's because the state is being lost? Here's some relevant info (only necessary parts of the files are provided): -- ModelData.swift: @Observable class ModelData { var allItems: [ItemDetails] = coreData.getAllItems() ... } -- ItemDetails.swift: struct ItemDetails: Identifiable, Hashable, Equatable { public let id: UUID = UUID() public var itemId: String // Also unique, but used for a different reason ... } -- MainApp.swift: let modelData: ModelData = ModelData() // Created as a global class SceneDelegate: UIResponder, UIWindowSceneDelegate { // Methods in here (and in lots of other places) use `modelData`, which is why it's a global } @main struct MainApp: App { var body: some Scene { WindowGroup { MainView() } } ... } -- MainView.swift: struct MainView: View { var body: some View { List { ForEach(modelData.allItems, id: \.id) { item in ItemRow(item) } } } } struct ItemRow: View, Equatable { var item: ItemDetails var body: some View { ... } static func == (lhs: Self, rhs: Self) -> Bool { lhs.item == rhs.item } } There's obviously more code in the app than that, but it's not relevant to the issue. I've tried: ItemRow(item).equatable() Wrapping ItemRow in an EquatableView Giving the List a unique id Using class ModelData: ObservableObject and @StateObject for modelData None made any difference. I'm using iOS/iPadOS 26.0.1, and I see it on my physical iPhone 17 Pro Max and iPad Pro 11-inch M4, but I don't see it in the equivalent simulators on those versions. The Simulator also doesn't exhibit this for versions 17.5 and 18.5, and I have no physical devices on 17.5/18.5 to check. Should I be doing as I currently am, where I create modelData as a global let so I can access it everywhere, or should I pass it through the view hierarchy as an Environment variable, like @Environment(ModelData.self) var modelData: ModelData? Bear in mind that some functions are outside of the view hierarchy and cannot access modelData if I do this. Various things like controllers that need access to values in modelData cannot get to it. Any ideas? Thanks.
2
0
133
Oct ’25
How to handle alert when deleting row from List
This is another issue found after changing to use a @StateObject for my data model when populating a List. Previous issue is here: https://developer.apple.com/forums/thread/805202 - the entire List was being redrawn when one value changed, and it jumped to the top. Here's some code: struct ItemListView: View { @State private var showAlert: Bool = false ... fileprivate func drawItemRow(_ item: ItemDetails) -> some View { return ItemRow(item: item) .id(item.id) .swipeActions(edge: .trailing, allowsFullSwipe: false) { RightSwipeButtons(showAlert: $showAlert, item: item) } } ... List { ForEach(modelData.filteredItems.filter { !$0.archived }) { item in drawItemRow(item) } } ... .alert("Delete Item"), isPresented: $showAlert) { Button("Yes, delete", role: .destructive) { deleteItem(item.id) // Not important how this item.id is gained } Button("Cancel", role: .cancel) { } } message: { Text("Are you sure you want to delete this item? You cannot undo this.") } } struct RightSwipeButtons: View { @Binding var showAlert: Bool var body: some View { Button { showAlert = true } label: { Label("", systemImage: "trash") } } } The issue I have now is that when you swipe from the right to show the Delete button, and tap it, the alert is displayed but the list has jumped back to the top again. At this point you haven't pressed the delete button on the alert. Using let _ = Self._printChanges() on both the ItemsListView and the individual ItemRows shows this: ItemsListView: _showAlert changed. ItemRow: @self, @identity, _accessibilityDifferentiateWithoutColor changed. So yeah, that's correct, showAlert did change in ItemsListView, but why does the entire view get redrawn again, and fire me back to the top of the list? You'll notice that it also says _accessibilityDifferentiateWithoutColor changed on the ItemRows, so I commented out their use to see if they were causing the issue, and... no. Any ideas? (Or can someone provide a working example of how to ditch SwiftUI's List and go back to a UITableView...?)
3
0
189
Oct ’25
Can't pin down how to show complications properly at different stages
I understand that complications in WidgetKit and watchOS 9 are different to the old ClockKit way, and I'm trying to populate the getSnapshot, getPlaceholder and getTimeline functions appropriately for the new method. I'm using dynamic intents, and I've got that working and providing a set of items I want the user to choose from, but at the various stages of selecting and adding a complication to the watch face, nothing I do seems to work properly on a device, and sometimes in the Simulator. On the Simulator: 1: The previews all use the same data, but getSnapshot() is supposed to return the data specific to that event from the configuration, i.e. if let theId = configuration.event?.identifier. "Christmas" is correct, but "Gallery Opening" is using Christmas's data. Are you only supposed to show ONE particular bit of data, like some dummy preview data or something? I can do that, but the complication picker then just looks really boring, with just the text below being different. I note that Apple's weather complications show different data. How did they do that? 2: You can see that once I pick an event it's displayed correctly in the Watch face edit screen: The "72d" circular complication is the "New York" event, and the rectangular one is correctly using the data for the "London Party!". 3: Once I've selected the events I want to use in those complications the edit screen shows them as totally blank, not even a placeholder. Which method gives us that preview? 4: Once I confirm the edits and return to the Watch face, the complications appear correctly: Note: This is all from the Simulator (apart from the image of Apple's Weather complications). This stuff barely works on a device. Half the time the complications are all placeholders, and half the time they're using the wrong data! If it works in the Simulator, it should work on the phone, or there is no point in giving us the Simulator if the results are different. So basically: Q1. How do I use different data in the complications picker? Q2. How do you get the previews to show when you're in edit mode? Q3. Does anyone know how to get print() statements to work when I'm running the Complications scheme? I could answer all these questions myself if I could output some debug info to the console, but all I see is the output from the Watch App target...
11
2
3.9k
Mar ’23
How to support foregroundColor (deprecated) and foregroundStyle in watchOS 9/10?
In my Watch app on watchOS 9 I was using .foregroundColor(myColour) to colour the text in a widgetLabel on a corner complication like this: let myColour: Color = functionThatReturnsAColorObjectConstructedLike Color.init(...) // green .widgetLabel { Text(myText) .foregroundColor(myColour) } It worked fine; the widget label was green. Now, in watchOS 10, I see that foregroundColor() is being deprecated in favour of foregroundStyle(), and I can use .foregroundStyle(.green), and - importantly - foregroundStyle() is only available on watchOS 10 and newer. myColour is calculated depending on some other info, so I can't just write .green, and when I use .foregroundStyle(myColour) the widget label comes out as white every time, even if I set myColour = .green. I think I have to use some sort of extension to pick the right combination, something like: extension View { func foregroundType(colour: Colour, style: any ShapeStyle) -> some THING? { if #available(watchOS 10.0, *) { return foregroundStyle(style) } else { return foregroundColor(colour) } } } // Usage let myStyle: any ShapeStyle = SOMETHING? ... .widgetLabel { Text(myText) .foregroundType(colour: myColour, style: myStyle) It doesn't work. I just can't figure out what should be returned, nor how to return it. Any ideas?
3
2
3.5k
Feb ’25
More spam on these forums...
... and yet, Apple's staff think it's appropriate to post lame responses thanking them for their interest in the forums. Come on, guys! It's obvious spam! Mark it as such and delete it. It's not beyond your abilities to stop people posting the word "WhatsApp" plus a phone number. You already stop us posting certain web links, so you can do this. If you continue ignoring the spam problem, then these forums will become less and less useful. Why should I contribute my free time to help others when you won't even help us?
2
3
170
Apr ’25
How to refresh a View?
In my Watch app, the WatchDelegate class is the WCSession delegate and handles transferring data with the iOS app. When the delegate receives some data it stores it in the UserDefaults. When the Watch app is launched it reads the existing data stored in the defaults and creates the view. I have a WatchApp file which contains this: @main struct WatchApp: App { var body: some Scene { WindowGroup { if(getItems().count == 0) { NoEventsView() } else { ItemsListView(available: getItems()) } } } } As you can see, if there are no events in the defaults it shows the NoEventsView; and if there are some it shows the EventsListView. When the Watch delegate receives a change in the events, I need to refresh this view. The delegate can receive zero or more events. How on Earth do I do that? In iOS I could call a method to reload a table of data, or post a notification to another view controller to do that, but in the Watch and with SwiftUI there doesn't seem to be any obvious way of refreshing a view. Is there any way of telling the App struct to refresh, or a particular view? For example, if I extracted the if statement into its own "struct WhichView: View", could I tell that to refresh? I've read a LOT on the net these past few days on @State vars, @ObservedObject, @Published etc, but nothing I've seen works, or is far too weird and complex for my situation. I literally just want WatchApp or WhichView to redraw when I tell it to. How do I do that? Thanks.
4
1
2.4k
Aug ’22
So many spam posts recently
... all talking about customer care numbers. Maybe Apple should make these Dev Forums just for signed-in Developers? If a Developer spams, they can be blocked. But if just anyone can register and post, they can spam, get banned, then start a new account. Or, Apple should implement some way of blocking the spam before it gets posted. I really don't understand what these spammers think they're getting out of doing this? Who is going to look through the forums and think, "Oh, a customer care number for something I've never heard of? I should phone that immediately!" Really does prove that spammers are dumb.
1
2
977
Sep ’22