Provide views, controls, and layout structures for declaring your app's user interface using SwiftUI.

SwiftUI Documentation

Posts under SwiftUI tag

2,333 Posts
Sort by:
Post not yet marked as solved
1 Replies
37 Views
Is there a system deep link URI to the built in files app? I would like to direct users to my apps location in the files app. For example files://myApp The only exposed deep links for system I can find are the ones for mail, sms, FaceTime etc. Thank you (tag used for post was because I couldn’t find a deep link tag)
Posted
by RyanTCB.
Last updated
.
Post not yet marked as solved
2 Replies
63 Views
Is it possible to switch to a new View without using NavigationStack or NavigationLink or NavigationView? I know I can do it with a Bool, which either shows the second view, or the first, and then toggles the Bool. But can't I do something like this? Which obviously doesn't work. struct BasicButton: View { var buttonLabel = "Create User" var body: some View { Button { CreateUser() //another SwiftUI view, not a function } label: { Text(buttonLabel) } } }
Posted
by SergioDCQ.
Last updated
.
Post not yet marked as solved
0 Replies
13 Views
Is there a way to modify the SignInWithAppleButton so that only the Apple logo appears? According to Apple's guidelines, it's permissible to use only the icon. https://developer.apple.com/design/human-interface-guidelines/sign-in-with-apple Unfortunately, the button isn't customizable. However, I need a button that utilizes the logic of onRequest and onCompletion. Here's my current code using the standard SignInWithAppleButton. SignInWithAppleButton(.signIn, onRequest: { request in print("Apple ID Request") AppleSignInManager.shared.requestAppleAuthorization(request) }, onCompletion: { result in print("Apple ID Completion") handleAppleID(result) } ) .font(.title) .signInWithAppleButtonStyle(.white) .frame(height: 50) I tried exploring various SwiftUI customization options for the SignInWithAppleButton, such as adjusting its style or overlaying it with a custom image. I was expecting to find a way to remove the text and display only the Apple logo, as permitted by Apple's guidelines. However, I found that the SignInWithAppleButton isn't easily customizable in this way. So, I'm seeking guidance on alternative approaches to achieve the desired customization while still maintaining the functionality provided by the onRequest and onCompletion handlers.
Posted
by zikomiko.
Last updated
.
Post not yet marked as solved
0 Replies
38 Views
Hi team, I'm running into the following issue, for which I don't seem to find a good solution. I would like to be able to drag and drop items from a view into empty space to open a new window that displays detailed information about this item. Now, I know something similar has been flagged already in this post (FB13545880: Support drag and drop to create a new window on visionOS) HOWEVER, all this does, is launch the App again with the SAME WindowGroup and display ContentView in a different state (show a selected product e.g.). What I would like to do, is instead launch ONLY the new WindowGroup, without a new instance of ContentView. This is the closest I got so far. It opens the desired window, but in addition it also displays the ContentView WindowGroup WindowGroup { ContentView() .onContinueUserActivity(Activity.openWindow, perform: handleOpenDetail) } WindowGroup(id: "Detail View", for: Reminder.ID.self) { $reminderId in ReminderDetailView(reminderId: reminderId! ) } .onDrag({ let userActivity = NSUserActivity(activityType: Activity.openWindow) let localizedString = NSLocalizedString("DroppedReminterTitle", comment: "Activity title with reminder name") userActivity.title = String(format: localizedString, reminder.title) userActivity.targetContentIdentifier = "\(reminder.id)" try? userActivity.setTypedPayload(reminder.id) // When setting the identifier let encoder = JSONEncoder() if let jsonData = try? encoder.encode(reminder.persistentModelID), let jsonString = String(data: jsonData, encoding: .utf8) { userActivity.userInfo = ["id": jsonString] } return NSItemProvider(object: userActivity) }) func handleOpenDetail(_ userActivity: NSUserActivity) { guard let idString = userActivity.userInfo?["id"] as? String else { print("Invalid or missing identifier in user activity") return } if let jsonData = idString.data(using: .utf8) { do { let decoder = JSONDecoder() let persistentID = try decoder.decode(PersistentIdentifier.self, from: jsonData) openWindow(id: "Detail View", value: persistentID) } catch { print("Failed to decode PersistentIdentifier: \(error)") } } else { print("Failed to convert string to data") } }
Posted Last updated
.
Post not yet marked as solved
2 Replies
87 Views
I am using @AppStorage in a model object (see code below that works as expected). class ModelObject { static let shared = ModelObject() @AppStorage("enhanced") var scriptPickers: Bool = true var defaultDependentValue: String { scriptPickers ? "Enhanced" : "NOT enhanced" } } struct ContentView: View { @AppStorage("enhanced") var scriptPickers: Bool = true var body: some View { VStack { Toggle(isOn: $scriptPickers, label: { Text("userDefault val") }) Text("value: \(ModelObject.shared.defaultDependentValue)") } } } Now I want to test my model object in a way that will allow me to use a mock instance of UserDefaults, but am having trouble with the syntax. I tried adding a userDefaults var, and referring to the var in the @AppStorage class ModelObject { static let shared = ModelObject() let userDefaults: UserDefaults init(userDefaults: UserDefaults = .standard) { self.userDefaults = userDefaults } @AppStorage("enhanced", store: userDefaults) var scriptPickers: Bool = true var defaultDependentValue: String { scriptPickers ? "Enhanced" : "NOT enhanced" } } However I can't find a way to avoid the syntax error this generates: Cannot use instance member 'userDefaults' within property initializer; property initializers run before 'self' is available Any guidance on how I might be able to: continue using @AppStorage be able to test my class in a way that doesn't force me to use UserDefaults.standard thanks, in advance, Mike
Posted Last updated
.
Post not yet marked as solved
8 Replies
2.4k Views
I added a keyboard toolbar inside ZStack. And it works right after appears as expected But after opening and closing another view over the .sheet modifier, The keyboard toolbar doesn't show anymore. ZStack { . .. TextField() .toolbar { ToolbarItemGroup(placement: .keyboard) { .... } } } .sheet(isPresent: $binding) { Some other view } Seems it happened after upgrading to iOS 16. Does anybody has the solution? Thanks
Posted
by Drigin.
Last updated
.
Post not yet marked as solved
0 Replies
31 Views
When I try to share a image of a component using the ImageRenderer, the type is not .png while sharing the image created using ShareLink (The type is .jpeg for some reasons...) My code looks like this: ShareLink( "Share", item: ( ImageRenderer( content: shareView.frame( width: 420, height: 520 ) ).uiImage?.pngData() )!, preview: SharePreview( "Share Preview", image: ( ImageRenderer( content: shareView.frame( width: 420, height: 520 ) ).uiImage?.pngData() )! ) ) Also the image shared is always in low resolution, if anyone knows what to do in this case let me know! Any helps will be appreciated!
Posted Last updated
.
Post not yet marked as solved
0 Replies
44 Views
I have a Canvas inside a ScrollView on a Mac. The Canvas's size is determined by a model (for the example below, I am simply drawing a grid of circles of a given radius). Everything appears to works fine. However, I am wondering if it is possible for the Canvas rendering code to know what portion of the Canvas is actually visible in the ScrollView? For example, if the Canvas is large but the visible portion is small, I would like to avoid drawing content that is not visible. Is this possible? Example of Canvas in a ScrollView I am using for testing: struct MyCanvas: View { @ObservedObject var model: MyModel var body: some View { ScrollView([.horizontal, .vertical]) { Canvas { context, size in // Placeholder rendering code for row in 0..<model.numOfRows { for col in 0..<model.numOfColumns { let left: CGFloat = CGFloat(col * model.radius * 2) let top: CGFloat = CGFloat(row * model.radius * 2) let size: CGFloat = CGFloat(model.radius * 2) let rect = CGRect(x: left, y: top, width: size, height: size) let path = Circle().path(in: rect) context.fill(path, with: .color(.red)) } } } .frame(width: CGFloat(model.numOfColumns * model.radius * 2), height: CGFloat(model.numOfRows * model.radius * 2)) } } }
Posted
by Todd2.
Last updated
.
Post not yet marked as solved
0 Replies
44 Views
I have a swiftui iPhone app running on the "iOS Apps on Mac" simulator. What I'm trying to do is get a notification when the window size changes, but nothing seems to work. I have tried .onReceive(NotificationCenter.default.publisher(for: UIContentSizeCategory.didChangeNotification)) { _ in updateStuff() } I also tried .onAppear() { updateStuff() } but neither seems to get called any suggestions ?
Posted Last updated
.
Post not yet marked as solved
5 Replies
507 Views
hi I have been using WKWebView embedded in a UIViewRepresentable for displaying inside a SwiftUI View hierarchy, but when I try the same code on 17,5 beta (simulator) the code fails. In fact, the code runs (no exceptions raised or anything) but the web view does not render. In the console logs I see: Warning: -[BETextInput attributedMarkedText] is unimplemented Error launching process, description 'The operation couldn’t be completed. (OSStatus error -10814.)', reason '' The code I am using to present the view is: struct MyWebView: UIViewRepresentable { let content: String func makeUIView(context: Context) -> WKWebView { // Javascript that disables pinch-to-zoom by inserting the HTML viewport meta tag into <head> let source: String = """ var meta = document.createElement('meta'); meta.name = 'viewport'; meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no'; var style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = '*:focus{outline:none}body{margin:0;padding:0}'; var head = document.getElementsByTagName('head')[0]; head.appendChild(meta); head.appendChild(style); """ let script: WKUserScript = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: true) let userContentController: WKUserContentController = WKUserContentController() let conf = WKWebViewConfiguration() conf.userContentController = userContentController userContentController.addUserScript(script) let webView = WKWebView(frame: CGRect.zero /*CGRect(x: 0, y: 0, width: 1000, height: 1000)*/, configuration: conf) webView.isOpaque = false webView.backgroundColor = UIColor.clear webView.scrollView.backgroundColor = UIColor.clear webView.scrollView.isScrollEnabled = false webView.scrollView.isMultipleTouchEnabled = false if #available(iOS 16.4, *) { webView.isInspectable = true } return webView } func updateUIView(_ webView: WKWebView, context: Context) { webView.loadHTMLString(content, baseURL: nil) } } This has been working for ages and ages (back to at least ios 15) - something changed. Maybe it is just a problem with the beta 17.5 release?
Posted Last updated
.
Post not yet marked as solved
1 Replies
257 Views
I'm using Text(targetDate, style:.relative) to show how a countdown of minutes until a given event. Unfortunately, this includes seconds, which takes unnecessary space and can get quite distracting when used on the dynamic island. There are many examples of apps that show estimates like "7 minutes" or "7 min" but how do they get the countdown to update? Are background updates reliable enough for this? Surely they don't send a push notification every minute to update the remaining time? Or is there some formatting option that I'm missing?
Posted
by mhalttu_.
Last updated
.
Post not yet marked as solved
0 Replies
73 Views
I want to change the display language, particularly for week and the year and date on MultiDatePicker. By adjusting the locale, the year and date can be changed. However, I'm unable to change the display for week . I've tried several methods, such as setting the calendar and adjusting the time zone, but none of them seem to work. Are there any good way to solve it?
Posted
by hcrane.
Last updated
.
Post not yet marked as solved
3 Replies
126 Views
I am trying to create an iOS app where I need to immediately know when the iPhone is unlocked. Let's say I want to print a log on the Xcode console whenever the phone is unlocked. From my app, how do I detect if the phone is unlocked? Some code pointers will be highly appreciated. I am a newbie in iOS/APP development. It should work even if my app is not running. Is it even possible to do so?
Posted Last updated
.
Post not yet marked as solved
3 Replies
73 Views
Hello, I use Preview to quickly test functionalities. However I found that the unified logging does not output to Preview console. So I had to do both log.debug and print. Is there a way to enable logging to Preview console?
Posted Last updated
.
Post not yet marked as solved
1 Replies
65 Views
I'm fairly new to SwiftUI and when I create a new file in a project and make edits to it, when in the process of commiting the changes to my local repository, i notice that Xcode is creating duplicate files of all my files with changes, including the main app file. They each have a '._' prefix on them. When I view the changes in these files the text is unrecognizable, and i can't locate them in finder. They seem to get in teway of trying to merge branches in my repository ._ContentView -----END SIGNED MESSAGE-----git_revwalk_new(&walk, repo)NSString *gitRepositoryIdentifier(git_repository *)git_revwalk_push_head(walk)gitErrorgit_commit_lookup(&commit, repo, &revisionOID)git_commit_tree(&tree, commit)git_mailmap_from_repository(&mailmap, repo)git_remote_list(&remotes, repo)git_remote *lookupRemote(git_repository *, DVTSourceControlRemoteRepository *__strong, BOOL, NSString *__autoreleasing *, NSError *__autoreleasing *)git_remote_lookup(&remote, repo, remoteName)status--porcelain-[DVTSourceControlGitPlugInPrimary(Status) _filesAndStatusOfWorkingCopy:withRemoteStatus:]git_status_list_new(&statusList, repo, &statusOptions)Silent error with libgit operation (%s)git_repository_head(&head, repo)git_branch_upstream(&upstreamBranch, head)git_merge_base(&mergeBase, repo, git_reference_target(head), git_reference_target(upstreamBranch))git_commit_lookup(&baseCommit, repo, &mergeBase)git_commit_tree(&baseTree, baseCommit)git_reference_peel((git_object **)&upstreamTree, upstreamBranch, GIT_OBJ_TREE)git_diff_tree_to_tree(&treeDiff, repo, baseTree, upstreamTree, &diffopts)%@...%@-[DVTSourceControlGitPlugInPrimary(Status) filesAndStatusOfWorkingCopy:sourceBranch:targetBranch:completionBlock:]git_reference_lookup(&sourceReference, repo, sourceBranchName)git_reference_lookup(&targetReference, repo, targetBranchName)git_reference_name_to_id(&source_tree_oid, repo, source_ref_name)git_reference_name_to_id(&target_tree_oid, repo, target_ref_name)git_reference_peel((git_object **)&sourceTree, sourceReference, GIT_OBJ_TREE)git_reference_peel((git_object **)&targetTree, targetReference, GIT_OBJ_TREE)diff--name-status git_merge_base(&merge_base, repo, &source_tree_oid, &target_tree_oid)--no-color--stagedcore.excludesfileB24@?0@8@"NSDictionary"16~/%@.gitignore_globalgit_config_set_string(levelConfig, "core.excludesfile", ignorePath.fileSystemRepresentation)-[DVTSourceControlGitPlugInPrimary(Ignore) setIgnoredFiles:completionBlock:]%s index.lockstashsave-u-[DVTSourceControlGitPlugInPrimary(Stash) stashChangesOfWorkingCopy:includingUnversioned:message:completionBlock:]i32@?0Q8r*16r^{git_oid=[20C]}24Could not locate stash identifier from revisionv24@?0q8@"NSError"16-[DVTSourceControlGitPlugInPrimary(Stash) _deleteStash:stashIdentifier:completionBlock:]git_stash_drop(repo, stashIdentifier)-[DVTSourceControlGitPlugInPrimary(Stash) _stashIdentiferFromRevision:workingCopy:completionBlock:]git_stash_foreach(repo, stashCallback, (__bridge void *)stashBlock)-[DVTSourceControlGitPlugInPrimary(Stash) applyStashInWorkingCopy:stash:completionBlock:]git_stash_apply(repo, stashIndex, &options)git_repository_index(&index, repo)show-p%ld%ld.patchCouldn't create temporary path for stash '%ld'Couldn't write data to path '%@'v16@?0@"DVTSourceControlHistoryResultType"8DVTSourceControlCMSClassErrorCodeKeyCMS Module Error with code %d.SecTrust could not validate the signing certificate.Signature is invalid or malformed.No remote repository specified for fetch.Specified local repository has no on-disk URL set.--jobs=%lufetch--atomic--quiet--no-recurse-submodulesv16@?0@"NSData"8debug1%@v24@?0@"NSString"8^B16ssh: Could not resolve hostnamePermission deniedHost key verification failedCould not read from remote repositoryUnknown error while fetching remote changes. Make sure the remote is set up correctly and that you have access to it.git_remote_fetch(remote, NULL, &fetchOptions, NULL)-[DVTSourceControlGitPlugInPrimary(Update) fetchFromRemoteRepositoryUsingLibGit:repo:includeTags:prune:error:]Failed to locate remote for URL '%@'-[DVTSourceControlGitPlugInPrimary(Update) downloadUpdatesFromRemoteRepository:toRepository:removeDeletedLocations:progressIdentifier:completionBlock:]-[DVTSourceControlGitPlu I notice that when following online tutorials on the subject of source control, they don't show any files like these. What am I missing?
Posted
by Donja.
Last updated
.
Post not yet marked as solved
0 Replies
50 Views
When adding a Map using the MapKit this changes the appearance of the TabBar appearance, specifically gives the toolbar a translucent background with a shadow; the default iOS style. I have tried adding the following modifier to the Map .toolbarBackground(Color("White"), for: .navigationBar) But the navigation toolbar still has a shadow, and the TabBar has the default translucent background colour with shadow. Root init() { // this is not the same as manipulating the proxy directly let appearance = UINavigationBarAppearance() // this overrides everything you have set up earlier. appearance.configureWithTransparentBackground() appearance.shadowColor = .clear //In the following two lines you make sure that you apply the style for good UINavigationBar.appearance().scrollEdgeAppearance = appearance UINavigationBar.appearance().standardAppearance = appearance UITabBar.appearance().barTintColor = UIColor.white) UITabBar.appearance().backgroundColor = UIColor.white) UITabBar.appearance().shadowImage = UIImage() UITabBar.appearance().backgroundImage = UIImage() UINavigationBar.appearance().isTranslucent = false UIToolbar.appearance().backgroundColor = UIColor.white) UIToolbar.appearance().isTranslucent = false UIToolbar.appearance().setShadowImage(UIImage(), forToolbarPosition: .any) } struct MainView: View { var body: some View { TabView { ContentView() .tabItem { Label("Menu", systemImage: "list.dash") } } } } The Tabbar has a solid white colour with no shadow, as well as navigation bars. Content View struct ContentView: View { var body: some View { NavigationStack() { NavigationLink(destination: MapView()) { Text("Hello, World!") } } .navigationTitle("Content") } } MapView struct MapView: View { @State private var region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 51.507222, longitude: -0.1275), span: MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5)) var body: some View { Map(coordinateRegion: $region) .mapControlVisibility(.hidden) .allowsHitTesting(false) .frame(maxWidth: .infinity) .frame(height: 414) .clipped() } } I have looked through the documentation but could not find anything. https://developer.apple.com/documentation/mapkit/map
Posted
by RileyDev.
Last updated
.
Post not yet marked as solved
4 Replies
458 Views
TabView { SummaryView() .toolbar(.hidden, for: .tabBar, .bottomBar) .tabItem { Text("Title.Summary") } .tag(TabItems.summary) CalendarView() .toolbar(.hidden, for: .tabBar, .bottomBar) .tabItem { Text("Title.Calendar") } .tag(TabItems.calendar) EventTypeView() .toolbar(.hidden, for: .tabBar, .bottomBar) .tabItem { Text("Title.EventType") } .tag(TabItems.group) LectureView() .toolbar(.hidden, for: .tabBar, .bottomBar) .tabItem { Text("Title.Lecture") } .tag(TabItems.lecture) NotificationView() .toolbar(.hidden, for: .tabBar, .bottomBar) .tabItem { Text("Title.Notifications") } .tag(TabItems.notification) } Tabbar is hidden when first opened but tabbar is appeared when I change tab selection. I tested it on iOS 17.1, iOS 17.4, and this bug is only appeared in iOS 17.4.
Posted
by LeeJaeho.
Last updated
.
Post marked as solved
2 Replies
70 Views
Hi, How to catch the event when details panel of a SplitView shows and get hidden, like when split is 2 columns and when its details only ? Kindest Regards
Posted Last updated
.