{"hierarchy":{"paths":[["doc://com.apple.app-dev-training/tutorials/app-dev-training","doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI","doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/SwiftUI-essentials"]],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training","modules":[{"projects":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#About-this-module","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#SwiftUI-overview","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#Tour-of-the-app","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#Tips-for-success"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#Time-to-begin","kind":"heading"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views","sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Create-a-project"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Compose-views","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Modify-and-style-views","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Supplement-accessibility-data"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Check-Your-Understanding"}]}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/SwiftUI-essentials"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Views","projects":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view","sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Import-color-themes"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Create-a-daily-scrum-model","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Create-the-card-view","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Stylize-the-card"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Customize-the-label-style"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Make-the-card-view-accessible"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Check-Your-Understanding"}]},{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-data-in-a-list#Display-a-list-of-daily-scrums","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-data-in-a-list#Make-scrums-identifiable"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-data-in-a-list#Check-Your-Understanding","kind":"assessment"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-data-in-a-list"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Navigation-and-modal-presentation","projects":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy","sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Set-up-navigation"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Create-the-detail-view","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Add-visual-components-to-the-detail-view","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Iterate-through-attendees","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Navigate-between-screens","kind":"task"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Check-Your-Understanding"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#Source-of-truth","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#Swift-property-wrappers"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#State","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#Binding"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#App-architecture"}]},{"sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Add-an-edit-view-for-scrum-details"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Display-attendees-in-the-edit-view","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Add-accessibility-modifiers","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Present-the-edit-view"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Check-Your-Understanding"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Passing-data","projects":[{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Add-a-theme-view","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Add-a-theme-picker"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Pass-the-edit-view-a-binding-to-data"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Pass-a-binding-into-the-detail-view","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Pass-a-binding-into-the-list-view","kind":"task"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Check-Your-Understanding"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/State-management","projects":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable","sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Working-with-reference-types"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Making-a-class-observable","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Monitoring-an-object-for-changes"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Putting-it-all-together","kind":"heading"}]},{"sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#Scene-architecture"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#Scene-phases-and-transitions"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#Events-and-state","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#View-life-cycle-events","kind":"heading"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events"},{"sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Create-an-overlay-view"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Extract-the-meeting-header"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Add-design-elements-to-the-meeting-header"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Create-a-source-of-truth-for-a-reference-type","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Add-life-cycle-events"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Extract-the-meeting-footer"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Trigger-sound-with-AVFoundation","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Check-Your-Understanding","kind":"assessment"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/updating-app-data","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/updating-app-data#Use-the-edit-view-to-create-a-new-scrum","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/updating-app-data#Add-scrum-history"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/updating-app-data#Check-Your-Understanding"}]}]},{"projects":[{"sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data#Refactor-structures-into-SwiftData-model-classes"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data#Create-sample-SwiftData-for-previews"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data#Integrate-SwiftData-models-with-SwiftUI-views"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data#Check-Your-Understanding","kind":"assessment"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data"},{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Add-an-error-wrapper-structure","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Create-an-error-view","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Report-errors"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Simulate-persistence-error","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Check-Your-Understanding","kind":"assessment"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Persistence-and-error-handling"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Drawing","projects":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view","sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view#Create-the-meeting-timer-view"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view#Draw-an-arc-segment","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view#Draw-the-progress-ring","kind":"task"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view#Check-Your-Understanding"}]}]},{"projects":[{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Scrum-timer-meeting-properties","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Scrum-timer-data-flow"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Speech-recognizer-architecture"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Timing-of-speech-recognition-actions","kind":"heading"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger"},{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Request-authorization-to-device-hardware","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Integrate-speech-recognition","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Display-recording-indicators","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Create-a-history-view"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Display-a-history-view"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Check-Your-Understanding"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text"},{"sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#What-youve-learned"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Whats-next","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Connecting-with-others","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Finding-inspiration"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Designing-for-everyone","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Creating-more-apps"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Ready-for-more-training"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Recording-audio"},{"projects":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today","sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#About-this-module"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#UIKit-overview"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#Tour-of-the-app"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#Tips-for-success","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#Time-to-build-the-app"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Create-a-project","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Add-a-collection-view-controller"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Create-a-reminder-model"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Configure-the-collection-as-a-list","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Configure-the-data-source"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Apply-a-snapshot"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Check-Your-Understanding"}]}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/UIKit-essentials"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Collection-views-and-navigation","projects":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views","sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Displaying-collections"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Creating-a-diffable-data-source","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Defining-cell-configurations","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Generating-data-source-snapshots","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Using-modern-collection-views-in-Today","kind":"heading"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Format-the-date-and-time","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Organize-view-controllers"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Change-the-cell-background-color"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Display-the-reminder-complete-status","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Check-Your-Understanding","kind":"assessment"}]},{"sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Make-the-model-identifiable"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Create-functions-for-accessing-the-model","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Create-a-custom-button-action","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Wire-a-target-action-pair","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Update-the-snapshot","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Make-the-action-accessible"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Preview-using-Accessibility-Inspector","kind":"task"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Check-Your-Understanding"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable"},{"sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Create-a-reminder-view"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Create-an-enumeration-for-rows","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Set-up-the-data-source","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Set-up-a-snapshot","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Display-the-detail-view","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Style-the-navigation-bar","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Check-Your-Understanding","kind":"assessment"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Making-editable-views","projects":[{"sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Create-sections-for-an-editing-mode"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Configure-the-view-and-editing-modes","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Add-an-edit-button"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Show-headers-in-editing-mode"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Check-Your-Understanding","kind":"assessment"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing"},{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Using-content-views-in-editing-mode","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Implementing-content-views","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Creating-a-custom-content-view","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Creating-a-custom-content-configuration"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Configuring-your-custom-content-view","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Applying-the-custom-content-configuration","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Using-custom-content-views-in-Today"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Extract-configuration-methods","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Create-a-reusable-layout-function"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Create-a-custom-view-with-a-text-field","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Conform-to-the-content-view-protocol"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Complete-the-content-view","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Display-the-content-view","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Create-content-views-for-the-date-and-notes"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Check-Your-Understanding"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Add-a-working-reminder","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Make-the-text-configuration-editable","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Make-the-date-configuration-editable","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Make-the-notes-configuration-editable"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Cancel-edits","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Observe-changes-in-a-view-hierarchy","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Check-Your-Understanding","kind":"assessment"}]}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Adding,-deleting,-and-filtering-reminders","projects":[{"sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Create-an-add-action"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Connect-the-target-action-pair","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Add-a-new-reminder-to-the-model","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Delete-a-reminder","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Check-Your-Understanding","kind":"assessment"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders"},{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Create-a-list-style-enumeration","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Filter-reminders-by-list-style","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Display-a-segmented-control"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Add-action-to-segmented-control","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Check-Your-Understanding","kind":"assessment"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders"}]},{"projects":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Accessibility-in-UIKit","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Accessibility-in-Today"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Actions-and-values"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Labels-and-traits"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Custom-accessibility-elements"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Ways-to-make-an-app-accessible","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Resources"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Whats-next","kind":"heading"}]},{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Create-relational-constraints","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Customize-the-appearance-of-the-progress-circle"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Display-the-header-view"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Update-progress-dynamically","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Make-the-progress-view-accessible","kind":"task"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Check-Your-Understanding"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-gradient-background","sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-gradient-background#Create-a-gradient-layer"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-gradient-background#Add-the-gradient-layer-to-the-list","kind":"task"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-gradient-background#Check-Your-Understanding"}]}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Custom-views-and-animation"},{"projects":[{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Fetch-reminders-asynchronously","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Convert-between-model-types"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Create-a-reminder-store"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Read-all-reminders"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Request-access-to-reminder-data","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Display-errors-to-the-user"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Display-reminders","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Test-EventKit-integration","kind":"task"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Check-Your-Understanding"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders"},{"sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Respond-to-change-notifications"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Read-reminders-individually","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Convert-between-model-types"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Save-reminders-individually","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Save-added-reminders"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Save-updated-reminders"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Remove-reminders"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Check-Your-Understanding","kind":"assessment"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#What-youve-learned","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Whats-next","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Connecting-with-others"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Researching-design"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Creating-more-apps","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Continuing-your-training"}]}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/System-frameworks"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/Next-steps/Tests","projects":[{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#About-this-module","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Technology-overview"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Tour-of-the-app","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Tips-for-success"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Time-to-begin","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Special-thanks"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes"},{"sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Decode-earthquake-data"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Test-the-decoder"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Decode-GeoJSON","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Decode-a-location","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Test-decoding-a-location"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Check-Your-Understanding"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-existentials-and-generics","sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-existentials-and-generics#Comparing-existential-and-generic-types"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-existentials-and-generics#Using-existential-types-in-Earthquakes","kind":"heading"}]},{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client#Create-a-network-client","kind":"task"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client#Test-the-quake-client","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client#View-client-data"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client#Check-Your-Understanding"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/Next-steps/Network-data","projects":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-structured-concurrency","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-structured-concurrency#Fetching-multiple-URLs","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-structured-concurrency#Protecting-data-with-actors"}]},{"sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data#Fetch-quake-location"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data#Cache-quake-details","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data#Fetch-multiple-locations"},{"kind":"assessment","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data#Check-Your-Understanding"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view#Show-quake-details","kind":"task"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view#Display-the-location-details"},{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view#Add-the-map-view"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view#Check-Your-Understanding","kind":"assessment"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft","sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#What-youve-learned"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Whats-next"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Connecting-with-others","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Finding-inspiration"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Designing-for-the-network"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Creating-more-apps"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Building-apps-for-other-platforms","kind":"heading"}]}]},{"projects":[{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#About-this-module","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#macOS-development"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Tour-of-the-app"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Training-plan","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Tips-for-success"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Time-to-begin"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/navigating-the-sample-project","sections":[{"kind":"task","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/navigating-the-sample-project#Explore-Article-Accelerator"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture","sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#App-structure-and-responsibilities"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#ArticleStore-package","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#Article","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#Models","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#Whats-next","kind":"heading"}]}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/macOS-essentials"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Navigation","projects":[{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation#Navigating-parallel-categories","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation#Defining-a-sidebar-interface"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation#Whats-next","kind":"heading"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation"}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/SwiftData","projects":[{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data#Article-state","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data#Persistence","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data#Whats-next"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data"},{"sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Creating-the-model-container-and-context"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Creating-a-model-container","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Setting-container-options"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Using-model-contexts","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Adding-objects","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Working-with-relationships","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Adding-elements-to-a-relationship","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Listing-elements-in-a-relationship","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Removing-elements-from-a-relationship"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Deleting-all-user-data","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Experimenting-with-SwiftData"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Whats-next"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering","sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Fetching-data-using-SwiftData"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Sorting-articles","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Using-sort-descriptors","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Filtering-articles"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Using-dynamic-queries"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Considering-user-data","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Whats-next"}]}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Core-macOS-features","projects":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Contrasting-toolkits","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Wrapping-a-Cocoa-view","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Creating-and-updating-your-view"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Wrapping-a-Cocoa-view-controller","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Managing-your-view-hierarchy","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Communicating-changes"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Using-coordinators"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#AppKit-in-Article-Accelerator"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Whats-next"}]},{"sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Creating-a-window-scene","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#The-main-window"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Auxiliary-windows","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Creating-a-window-group-for-data-driven-windows","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Sizing-and-positioning-windows","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-windows-programmatically"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-unique-windows"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-a-data-driven-window-group"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Whats-next","kind":"heading"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts","sections":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Adding-menu-bar-commands","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Experimenting-with-adaptive-menus","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Experimenting-with-unavailable-menu-commands","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Creating-command-menus","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Supplementing-commands-with-keyboard-shortcuts","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Working-with-default-commands"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Replacing-existing-commands","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Removing-existing-commands","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Creating-a-context-menu","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Whats-next"}]},{"sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Styling-a-toolbar"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Configuring-toolbar-items","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Enabling-toolbar-customization"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Ensuring-toolbar-accessibility"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Whats-next"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars"},{"sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Defining-a-draggable-source-view"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Defining-a-drop-destination"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Reordering-dynamic-content"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Experimenting-with-featured-articles"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Whats-next","kind":"heading"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings","sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Choosing-a-location-for-app-settings"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Creating-a-settings-window","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Defining-Article-Accelerator-settings","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Whats-next"}]}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Other-frameworks","projects":[{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit","sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Creating-tips"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Setting-rules"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Defining-actions"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Loading-tips"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Displaying-tips"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Using-inline-tips-in-Article-Accelerator"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Using-popover-tips-in-Article-Accelerator"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Limiting-tip-frequency"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Resetting-tips","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Experimenting-with-tips"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Considering-design","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Whats-next","kind":"heading"}]}]},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Design","projects":[{"sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Orienting-users-in-your-app"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Displaying-navigation-cues","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Representing-your-content-hierarchy","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Visually-organize-your-app"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Choosing-when-to-fill-available-space"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Adapting-grid-contents-to-fill-a-window","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Restricting-line-length-for-readability","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Balancing-adaptability-and-readability","kind":"heading"},{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Providing-context-clues"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Making-apps-for-everyone","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Whats-next","kind":"heading"}],"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge","sections":[{"kind":"heading","reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#What-youve-learned"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Whats-next","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Reviewing-the-sample-code-in-depth","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Connecting-with-others","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Researching-design","kind":"heading"},{"reference":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Creating-more-apps","kind":"heading"}]}]}]},"schemaVersion":{"major":0,"minor":3,"patch":0},"metadata":{"categoryPathComponent":"app-dev-training","category":"App Dev","role":"article","title":"Getting started with Scrumdinger"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["/tutorials/app-dev-training/getting-started-with-scrumdinger"]}],"kind":"article","sections":[{"backgroundImage":"SUI000_hero.png","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Learn the essentials of iOS app development by building a fully functional app using SwiftUI."}]},{"inlineContent":[{"type":"text","text":"Before you start the module, take a few minutes to familiarize yourself with the background requirements, the key concepts behind SwiftUI, and the app that you’ll build."}],"type":"paragraph"}],"kind":"hero","title":"Getting started with Scrumdinger","estimatedTimeInMinutes":5,"image":"SUI000_hero.png"},{"kind":"articleBody","content":[{"content":[{"text":"About this module","type":"heading","level":2,"anchor":"About-this-module"},{"inlineContent":[{"text":"These tutorials are created for experienced developers who are new to SwiftUI.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You’ll need to know about Swift before you begin, so start by reviewing "},{"identifier":"https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/","isActive":true,"type":"reference"},{"text":" of the Swift programming language for an overview of syntax, data types, and unique language features, such as optionals.","type":"text"},{"type":"text","text":" "},{"text":"Also review the ","type":"text"},{"identifier":"https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures/","isActive":true,"type":"reference"},{"type":"text","text":" section because you’ll use them frequently in SwiftUI."}],"type":"paragraph"},{"anchor":"SwiftUI-overview","type":"heading","level":2,"text":"SwiftUI overview"},{"inlineContent":[{"text":"SwiftUI is a declarative framework for building apps for any Apple platform.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"SwiftUI provides a common API that you can use to define an app’s user interface and platform-specific behavior."}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Create apps more quickly and with fewer errors with these key SwiftUI features:"}]},{"items":[{"content":[{"inlineContent":[{"text":"Declarative syntax—Define which views appear onscreen using simple Swift structures.","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"A compositional API—Quickly create and iterate your user interface using built-in views and modifiers. Compose more complex views by combining simpler views."}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"A powerful layout system—Easily arrange views onscreen relative to their parent views and to each other.","type":"text"},{"text":" ","type":"text"},{"text":"When existing views and controls don’t suit your needs, you can draw your own.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Views that reflect app data—Define a view’s data dependencies, and SwiftUI automatically updates the view when data changes, avoiding errors from invalid view states.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Automatic accessibility support—SwiftUI adds basic accessibility that you’ll learn to enhance with minimal effort."}]}]}],"type":"unorderedList"},{"text":"Tour of the app","anchor":"Tour-of-the-app","level":2,"type":"heading"},{"type":"paragraph","inlineContent":[{"text":"Many software engineering teams use daily meetings, known as scrums, to plan their work for the day.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Scrums are short meetings where each attendee discusses what they accomplished yesterday, what they are working on today, and any obstacles that might impact their work."}]},{"type":"paragraph","inlineContent":[{"text":"This module guides you through the development of Scrumdinger, an iOS app that helps teams manage their daily scrums.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"To help keep scrums short and focused, Scrumdinger uses visual and audio cues to indicate when and how long each attendee should speak."},{"text":" ","type":"text"},{"type":"text","text":"The app also displays a progress screen that shows the time remaining in the meeting and creates a transcript that the users can refer to later."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Here’s a closer look at what you’ll build in this module."}]}],"kind":"fullWidth"},{"kind":"contentAndMedia","media":"SUI000_001.png","mediaPosition":"trailing","content":[{"level":3,"anchor":"Scrum-list","type":"heading","text":"Scrum list"},{"inlineContent":[{"text":"The main screen of the app displays a summary of each of the user’s daily scrums.","type":"text"},{"type":"text","text":" "},{"text":"Users can tap a row in the list to view the details of a scrum or create a new scrum by tapping a button in the navigation bar.","type":"text"}],"type":"paragraph"}]},{"kind":"contentAndMedia","content":[{"anchor":"Scrum-detail-and-edit","type":"heading","text":"Scrum detail and edit","level":3},{"type":"paragraph","inlineContent":[{"type":"text","text":"The detail screen shows more information about a scrum, including the name of each attendee and a list of previous meetings."},{"text":" ","type":"text"},{"type":"text","text":"Users can modify any of the scrum’s attributes by tapping a button in the navigation bar."},{"type":"text","text":" "},{"type":"text","text":"The edit screen includes a picker with which users can change the color theme of each meeting."},{"text":" ","type":"text"},{"type":"text","text":"Tapping a button the top of the list of attributes starts a new meeting timer."}]}],"media":"SUI000_002.png","mediaPosition":"trailing"},{"content":[{"text":"Meeting timer","type":"heading","level":3,"anchor":"Meeting-timer"},{"type":"paragraph","inlineContent":[{"text":"The progress bar at the top of the meeting timer shows the elapsed and remaining time for the meeting.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"The app displays the name of the current speaker in the center of the screen and a button to advance to the next attendee at the bottom of the screen."}]},{"inlineContent":[{"text":"Segments in a circular progress ring represent each attendee.","type":"text"},{"type":"text","text":" "},{"text":"When an attendee uses all their time, Scrumdinger plays a “ding” sound and adds a new segment to the ring.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"The meeting ends when the ring is full."}],"type":"paragraph"}],"mediaPosition":"trailing","media":"SUI000_003.png","kind":"contentAndMedia"},{"kind":"fullWidth","content":[{"text":"Tips for success","type":"heading","anchor":"Tips-for-success","level":2},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Learn best by doing. Each tutorial includes starter and completed projects. Open the starter project and complete each step in the tutorial.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Take an active role in your learning."},{"text":" ","type":"text"},{"type":"text","text":"Read each step, and think about how you would accomplish the given task before you view the code suggestion."}]}]},{"content":[{"inlineContent":[{"type":"text","text":"Make sure that you install the "},{"isActive":true,"identifier":"https://apps.apple.com/us/app/xcode/id497799835?mt=12","type":"reference"},{"type":"text","text":"."}],"type":"paragraph"}]}],"type":"unorderedList"},{"type":"heading","anchor":"Time-to-begin","level":2,"text":"Time to begin"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Now that you’ve learned about Scrumdinger, it’s time to build it. And don’t worry if you get stuck."},{"type":"text","text":" "},{"type":"text","text":"You can view the code suggestions for each step as you work through a tutorial, or you can download and review the completed project in Xcode."},{"type":"text","text":" "},{"text":"You can also visit the ","type":"text"},{"type":"reference","identifier":"https://developer.apple.com/forums/tags/swiftui","isActive":true},{"text":" to get help on a variety of development topics.","type":"text"}]}]}]},{"title":"Using stacks to arrange views","action":{"overridingTitle":"Get started","type":"reference","isActive":true,"overridingTitleInlineContent":[{"text":"Get started","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views"},"media":"SUI010-cta.png","abstract":[{"text":"Create, modify, and combine views to compose your app’s user interface using the SwiftUI declarative syntax.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"You’ll start building Scrumdinger, an app that manages meetings, by arranging groups of views to create the meeting timer screen."},{"text":" ","type":"text"},{"text":"As you progress through the module, you’ll revisit the timer screen as you work toward the final design.","type":"text"}],"kind":"callToAction","featuredEyebrow":"Tutorial"}],"identifier":{"interfaceLanguage":"swift","url":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger"},"references":{"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Accessibility-in-UIKit":{"title":"Accessibility in UIKit","type":"section","url":"/tutorials/app-dev-training/examining-accessibility-in-today#Accessibility-in-UIKit","abstract":[{"type":"text","text":"During the development of Today, you’ve created a custom accessibility action, label, and value."},{"type":"text","text":" "},{"type":"text","text":"However, the app takes advantage of many accessibility features by default."}],"kind":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Accessibility-in-UIKit"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Apply-a-snapshot":{"title":"Apply a snapshot","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Apply-a-snapshot","type":"section","url":"/tutorials/app-dev-training/creating-a-list-view#Apply-a-snapshot","role":"pseudoSymbol","abstract":[{"text":"In this tutorial, you’ll create your app’s root view, a collection view with a list layout that displays the user’s daily reminders.","type":"text"}],"kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today":{"title":"Getting started with Today","role":"article","url":"/tutorials/app-dev-training/getting-started-with-today","estimatedTime":"5min","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today","type":"topic","abstract":[{"type":"text","text":"Learn to develop a fully functional app with the UIKit framework."}],"kind":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Create-an-overlay-view":{"kind":"section","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Create-an-overlay-view","role":"pseudoSymbol","title":"Create an overlay view","abstract":[{"type":"text","text":"Scrumdinger keeps you informed as your scrum changes."},{"type":"text","text":" "},{"type":"text","text":"To build this key feature in the app, you’ll use life cycle methods to control a model that manages the scrum state."}],"url":"/tutorials/app-dev-training/managing-state-and-life-cycle#Create-an-overlay-view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Add-a-new-reminder-to-the-model":{"kind":"section","abstract":[{"text":"In this tutorial, you’ll add the ability to create new reminders and delete existing ones.","type":"text"}],"url":"/tutorials/app-dev-training/adding-and-deleting-reminders#Add-a-new-reminder-to-the-model","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Add-a-new-reminder-to-the-model","type":"section","title":"Add a new reminder to the model","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Make-the-text-configuration-editable":{"title":"Make the text configuration editable","kind":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/editing-reminders#Make-the-text-configuration-editable","type":"section","abstract":[{"text":"In this tutorial, you’ll add an editing mode to Today that lets users edit the details of a reminder.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Make-the-text-configuration-editable"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Finding-inspiration":{"title":"Finding inspiration","abstract":[{"type":"text","text":"You’ve taken the next steps as a developer. Review what you’ve learned, and get ideas about where to go from here."}],"kind":"section","type":"section","url":"/tutorials/app-dev-training/refining-your-craft#Finding-inspiration","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Finding-inspiration"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Communicating-changes":{"url":"/tutorials/app-dev-training/integrating-appkit#Communicating-changes","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Communicating-changes","title":"Communicating changes","abstract":[{"type":"text","text":"The AppKit framework provides a powerful and extensive API for building graphical interfaces for macOS apps."},{"text":" ","type":"text"},{"text":"Using AppKit, you’ll create amazing apps that tap into the full power of macOS.","type":"text"}],"role":"pseudoSymbol","type":"section","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Create-an-error-view":{"url":"/tutorials/app-dev-training/handling-errors#Create-an-error-view","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Create-an-error-view","title":"Create an error view","role":"pseudoSymbol","type":"section","kind":"section","abstract":[{"type":"text","text":"During the development of your app, you may have encountered and fixed syntax or semantic errors."},{"type":"text","text":" "},{"type":"text","text":"But unexpected issues that are out of your control can still happen."},{"type":"text","text":" "},{"type":"text","text":"Network connections can break."},{"type":"text","text":" "},{"type":"text","text":"Reading data from a file can fail in several ways."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Compose-views":{"title":"Compose views","kind":"section","url":"/tutorials/app-dev-training/using-stacks-to-arrange-views#Compose-views","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Compose-views","abstract":[{"text":"Create, modify, and combine views to compose your app’s user interface using the SwiftUI declarative syntax.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll start building Scrumdinger, an app that manages meetings, by arranging groups of views to create the meeting timer screen.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"As you progress through the module, you’ll revisit the timer screen as you work toward the final design."}],"type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Training-plan":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Training-plan","url":"/tutorials/app-dev-training/getting-started-with-article-accelerator#Training-plan","abstract":[{"type":"text","text":"Explore SwiftUI sample code to learn how to build a desktop-class macOS app."},{"type":"text","text":" "},{"text":"Learn about the development and design principles that make an app feel at home on Mac.","type":"text"}],"role":"pseudoSymbol","type":"section","title":"Training plan","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Add-an-edit-button":{"abstract":[{"type":"text","text":"In this tutorial, you’ll begin implementing an editing mode for Today so that users can modify the details of a reminder they’re viewing."},{"text":" ","type":"text"},{"text":"You’ll configure the data source for view and editing modes, and add a button that transitions between the two modes.","type":"text"}],"type":"section","title":"Add an edit button","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Add-an-edit-button","url":"/tutorials/app-dev-training/getting-ready-for-editing#Add-an-edit-button","kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows":{"url":"/tutorials/app-dev-training/supporting-multiple-windows","abstract":[{"type":"text","text":"Mac users expect to use multiple windows to multitask, quickly switch between frequently used features of an app, or work with multiple pieces of an app’s content at the same time."},{"text":" ","type":"text"},{"type":"text","text":"A window can contain a title, toolbar, menu commands, and keyboard shortcuts to help users work efficiently."}],"estimatedTime":"20min","title":"Supporting multiple windows","kind":"article","role":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows","type":"topic"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client#Create-a-network-client":{"type":"section","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client#Create-a-network-client","abstract":[{"text":"Start building a network client by building a test client.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Test and preview your views without a network."}],"url":"/tutorials/app-dev-training/building-a-network-test-client#Create-a-network-client","title":"Create a network client","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Integrate-speech-recognition":{"role":"pseudoSymbol","title":"Integrate speech recognition","abstract":[{"text":"In this tutorial, you’ll add a feature to Scrumdinger that captures and logs meeting transcripts.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"You’ll request access to device hardware like the microphone and integrate the Speech framework to transcribe live audio to text."}],"url":"/tutorials/app-dev-training/transcribing-speech-to-text#Integrate-speech-recognition","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Integrate-speech-recognition","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Deleting-all-user-data":{"kind":"section","abstract":[{"type":"text","text":"In the previous article, you examined how to define your app’s storage schema in its model code."},{"text":" ","type":"text"},{"text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Deleting-all-user-data","title":"Deleting all user data","role":"pseudoSymbol","url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Deleting-all-user-data","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Experimenting-with-adaptive-menus":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Experimenting-with-adaptive-menus","kind":"section","type":"section","url":"/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Experimenting-with-adaptive-menus","title":"Experimenting with adaptive menus","abstract":[{"type":"text","text":"Menu bars and keyboard shortcuts are ubiquitous to the macOS experience."},{"text":" ","type":"text"},{"type":"text","text":"Although users can directly interact with UI elements, macOS apps support alternate workflows by surfacing frequent actions in an app’s menu or with keyboard shortcuts."}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Create-a-reminder-store":{"url":"/tutorials/app-dev-training/loading-reminders#Create-a-reminder-store","abstract":[{"text":"With the EventKit framework, you can request access to a user’s calendar events and reminders.","type":"text"},{"text":" ","type":"text"},{"text":"You can use EventKit to share data between the Reminders and Today apps.","type":"text"}],"role":"pseudoSymbol","title":"Create a reminder store","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Create-a-reminder-store","kind":"section","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Display-recording-indicators":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Display-recording-indicators","abstract":[{"text":"In this tutorial, you’ll add a feature to Scrumdinger that captures and logs meeting transcripts.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You’ll request access to device hardware like the microphone and integrate the Speech framework to transcribe live audio to text."}],"url":"/tutorials/app-dev-training/transcribing-speech-to-text#Display-recording-indicators","kind":"section","type":"section","role":"pseudoSymbol","title":"Display recording indicators"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Supplement-accessibility-data":{"url":"/tutorials/app-dev-training/using-stacks-to-arrange-views#Supplement-accessibility-data","role":"pseudoSymbol","kind":"section","abstract":[{"text":"Create, modify, and combine views to compose your app’s user interface using the SwiftUI declarative syntax.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You’ll start building Scrumdinger, an app that manages meetings, by arranging groups of views to create the meeting timer screen."},{"type":"text","text":" "},{"text":"As you progress through the module, you’ll revisit the timer screen as you work toward the final design.","type":"text"}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Supplement-accessibility-data","title":"Supplement accessibility data"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Loading-tips":{"role":"pseudoSymbol","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Loading-tips","url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Loading-tips","title":"Loading tips","abstract":[{"type":"text","text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app."},{"text":" ","type":"text"},{"text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app.","type":"text"}],"kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Organize-view-controllers":{"role":"pseudoSymbol","type":"section","abstract":[{"text":"Today uses a collection view to display a list of reminders in a sequence of cells.","type":"text"}],"url":"/tutorials/app-dev-training/displaying-cell-info#Organize-view-controllers","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Organize-view-controllers","kind":"section","title":"Organize view controllers"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Whats-next":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Whats-next","abstract":[{"type":"text","text":"A macOS window has a toolbar at the top of the window’s frame."},{"type":"text","text":" "},{"type":"text","text":"This area displays the title of the window and provides a space for controls and other tools that can access features in your app."}],"url":"/tutorials/app-dev-training/working-with-toolbars#Whats-next","kind":"section","title":"What’s next?","type":"section","role":"pseudoSymbol"},"SUI000_002.png":{"variants":[{"url":"https://docs-assets.developer.apple.com/published/0fa38d936a2209a59b03c7ad938753ed/SUI000_002.png","traits":["1x","light"]},{"url":"https://docs-assets.developer.apple.com/published/9dde9e7bed1e276c39caaf1d55351350/SUI000_002%402x.png","traits":["2x","light"]},{"traits":["1x","dark"],"url":"https://docs-assets.developer.apple.com/published/d66f2d17d3978fbf5e930d7b7b9f8c07/SUI000_002~dark.png"},{"traits":["2x","dark"],"url":"https://docs-assets.developer.apple.com/published/741b98ec9b9f5bafb5a58e336f9c9a7d/SUI000_002~dark%402x.png"}],"identifier":"SUI000_002.png","alt":"Screenshot of scrum details shown in grouped lists, including Meeting info, Attendees, and History","type":"image"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Experimenting-with-featured-articles":{"type":"section","kind":"section","title":"Experimenting with featured articles","abstract":[{"type":"text","text":"On macOS, users can drag an item from one place in an app to another location."},{"type":"text","text":" "},{"text":"With these drag-and-drop operations, users can perform actions like moving or copying an item.","type":"text"}],"role":"pseudoSymbol","url":"/tutorials/app-dev-training/supporting-drag-and-drop#Experimenting-with-featured-articles","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Experimenting-with-featured-articles"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/updating-app-data":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/updating-app-data","role":"project","estimatedTime":"15min","kind":"project","title":"Updating app data","abstract":[{"type":"text","text":"In this tutorial, you’ll add two new features to Scrumdinger."},{"type":"text","text":" "},{"type":"text","text":"First, you’ll add a view to create new daily scrum meetings."},{"text":" ","type":"text"},{"text":"Then, you’ll update the meeting timer to keep track of past meetings.","type":"text"}],"type":"topic","url":"/tutorials/app-dev-training/updating-app-data"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Pass-a-binding-into-the-detail-view":{"title":"Pass a binding into the detail view","url":"/tutorials/app-dev-training/passing-data-with-bindings#Pass-a-binding-into-the-detail-view","type":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Pass-a-binding-into-the-detail-view","abstract":[{"text":"In the previous tutorial, you used bindings to share data between the edit view and individual UI controls within that view.","type":"text"},{"text":" ","type":"text"},{"text":"Now, you’ll expand the editing capabilities by building a color theme picker using bindings that allow the theme picker and edit views to share their data.","type":"text"}],"kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Display-the-reminder-complete-status":{"abstract":[{"type":"text","text":"Today uses a collection view to display a list of reminders in a sequence of cells."}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Display-the-reminder-complete-status","title":"Display the reminder complete status","type":"section","kind":"section","url":"/tutorials/app-dev-training/displaying-cell-info#Display-the-reminder-complete-status"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Balancing-adaptability-and-readability":{"url":"/tutorials/app-dev-training/exploring-app-design#Balancing-adaptability-and-readability","kind":"section","title":"Balancing adaptability and readability","abstract":[{"text":"Explore aspects of the app’s user experience and visual design.","type":"text"},{"text":" ","type":"text"},{"text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way.","type":"text"},{"text":" ","type":"text"},{"text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Balancing-adaptability-and-readability","type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Resources":{"url":"/tutorials/app-dev-training/examining-accessibility-in-today#Resources","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Resources","title":"Resources","kind":"section","type":"section","abstract":[{"text":"During the development of Today, you’ve created a custom accessibility action, label, and value.","type":"text"},{"type":"text","text":" "},{"text":"However, the app takes advantage of many accessibility features by default.","type":"text"}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings":{"estimatedTime":"5min","type":"topic","title":"Displaying app settings","kind":"article","url":"/tutorials/app-dev-training/displaying-app-settings","role":"article","abstract":[{"text":"macOS apps often offer users a way to customize their experience.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Learn about the different areas where you can surface app settings."},{"type":"text","text":" "},{"type":"text","text":"Examine how Article Accelerator creates an app-specific settings window."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#Binding":{"role":"pseudoSymbol","abstract":[{"text":"Displaying information to the user and modifying data in response to user interactions are essential functions of most apps.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll learn how to use "},{"code":"@State","type":"codeVoice"},{"type":"text","text":" and "},{"type":"codeVoice","code":"@Binding"},{"type":"text","text":" to ensure that your user interface reflects the current state of your app’s data."}],"url":"/tutorials/app-dev-training/managing-data-flow-between-views#Binding","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#Binding","title":"Binding","kind":"section","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Managing-your-view-hierarchy":{"type":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/integrating-appkit#Managing-your-view-hierarchy","abstract":[{"text":"The AppKit framework provides a powerful and extensive API for building graphical interfaces for macOS apps.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Using AppKit, you’ll create amazing apps that tap into the full power of macOS."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Managing-your-view-hierarchy","title":"Managing your view hierarchy","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Make-the-notes-configuration-editable":{"title":"Make the notes configuration editable","url":"/tutorials/app-dev-training/editing-reminders#Make-the-notes-configuration-editable","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Make-the-notes-configuration-editable","abstract":[{"text":"In this tutorial, you’ll add an editing mode to Today that lets users edit the details of a reminder.","type":"text"}],"type":"section","kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy":{"title":"Creating a navigation hierarchy","url":"/tutorials/app-dev-training/creating-a-navigation-hierarchy","kind":"project","type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy","abstract":[{"text":"You’ve learned how to create SwiftUI views, but you need to know how to navigate between them.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"In this tutorial, you’ll create a navigation hierarchy."}],"estimatedTime":"20min","role":"project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Fetching-data-using-SwiftData":{"abstract":[{"type":"text","text":"Previously, you learned how to create a SwiftData model context and add objects to it."},{"text":" ","type":"text"},{"type":"text","text":"In this article, you’ll learn how Article Accelerator fetches objects from a persistent store."},{"type":"text","text":" "},{"text":"And you’ll explore how to sort and filter the objects to list only the objects that you want.","type":"text"}],"role":"pseudoSymbol","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Fetching-data-using-SwiftData","url":"/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Fetching-data-using-SwiftData","title":"Fetching data using SwiftData","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Whats-next":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Whats-next","url":"/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Whats-next","abstract":[{"type":"text","text":"Menu bars and keyboard shortcuts are ubiquitous to the macOS experience."},{"type":"text","text":" "},{"text":"Although users can directly interact with UI elements, macOS apps support alternate workflows by surfacing frequent actions in an app’s menu or with keyboard shortcuts.","type":"text"}],"role":"pseudoSymbol","type":"section","title":"What’s next?","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-a-data-driven-window-group":{"url":"/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-a-data-driven-window-group","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-a-data-driven-window-group","abstract":[{"type":"text","text":"Mac users expect to use multiple windows to multitask, quickly switch between frequently used features of an app, or work with multiple pieces of an app’s content at the same time."},{"type":"text","text":" "},{"type":"text","text":"A window can contain a title, toolbar, menu commands, and keyboard shortcuts to help users work efficiently."}],"kind":"section","title":"Opening and dismissing a data-driven window group","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars":{"abstract":[{"type":"text","text":"A macOS window has a toolbar at the top of the window’s frame."},{"type":"text","text":" "},{"type":"text","text":"This area displays the title of the window and provides a space for controls and other tools that can access features in your app."}],"url":"/tutorials/app-dev-training/working-with-toolbars","role":"article","estimatedTime":"10min","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars","title":"Working with toolbars","kind":"article","type":"topic"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Cancel-edits":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Cancel-edits","abstract":[{"text":"In this tutorial, you’ll add an editing mode to Today that lets users edit the details of a reminder.","type":"text"}],"type":"section","title":"Cancel edits","kind":"section","url":"/tutorials/app-dev-training/editing-reminders#Cancel-edits","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view":{"kind":"project","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view","url":"/tutorials/app-dev-training/adding-the-detail-view","type":"topic","title":"Adding the detail view","abstract":[{"text":"Earthquakes displays a list, with each element showing a sample of the available information for a recent earthquake.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"When the user taps a quake in the list, you’ll provide detailed information about that quake in a view that transitions onscreen."}],"role":"project","estimatedTime":"25min"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Replacing-existing-commands":{"kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Replacing-existing-commands","url":"/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Replacing-existing-commands","title":"Replacing existing commands","type":"section","abstract":[{"type":"text","text":"Menu bars and keyboard shortcuts are ubiquitous to the macOS experience."},{"type":"text","text":" "},{"text":"Although users can directly interact with UI elements, macOS apps support alternate workflows by surfacing frequent actions in an app’s menu or with keyboard shortcuts.","type":"text"}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Tips-for-success":{"role":"pseudoSymbol","url":"/tutorials/app-dev-training/getting-started-with-earthquakes#Tips-for-success","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Tips-for-success","abstract":[{"text":"Take the next steps in app development, and build an app to download, decode, and present data from a network data source.","type":"text"},{"text":" ","type":"text"},{"text":"Use SwiftUI to build a simple interface to display dynamic data from a concurrent network client.","type":"text"}],"type":"section","title":"Tips for success","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Working-with-relationships":{"url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Working-with-relationships","title":"Working with relationships","kind":"section","abstract":[{"text":"In the previous article, you examined how to define your app’s storage schema in its model code.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data."}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Working-with-relationships","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Add-accessibility-modifiers":{"abstract":[{"type":"text","text":"In this tutorial, you’ll create a new view containing controls to edit a scrum."},{"type":"text","text":" "},{"text":"SwiftUI provides all the standard controls for iOS apps.","type":"text"},{"type":"text","text":" "},{"text":"You’ll add buttons, a slider, and a text field.","type":"text"},{"text":" ","type":"text"},{"text":"Then, you’ll update the detail view to present your new edit view.","type":"text"}],"title":"Add accessibility modifiers","kind":"section","role":"pseudoSymbol","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Add-accessibility-modifiers","url":"/tutorials/app-dev-training/creating-the-edit-view#Add-accessibility-modifiers"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Set-up-navigation":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Set-up-navigation","type":"section","abstract":[{"text":"You’ve learned how to create SwiftUI views, but you need to know how to navigate between them.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this tutorial, you’ll create a navigation hierarchy."}],"url":"/tutorials/app-dev-training/creating-a-navigation-hierarchy#Set-up-navigation","kind":"section","title":"Set up navigation","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data#Cache-quake-details":{"abstract":[{"text":"Your quake client fetches a list of earthquakes from the network.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Now, you’ll extend the client to fetch location details for each earthquake."},{"type":"text","text":" "},{"type":"text","text":"Each earthquake requires one additional fetch to retrieve the location information."},{"type":"text","text":" "},{"type":"text","text":"You’ll make multiple network connections concurrently while maintaining a cache of replies."}],"url":"/tutorials/app-dev-training/caching-network-data#Cache-quake-details","title":"Cache quake details","type":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data#Cache-quake-details","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Reviewing-the-sample-code-in-depth":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Reviewing-the-sample-code-in-depth","url":"/tutorials/app-dev-training/growing-your-knowledge#Reviewing-the-sample-code-in-depth","abstract":[{"text":"You’ve completed this module and studied a macOS sample app.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Review what you’ve learned, and get ideas about where to go from here."}],"title":"Reviewing the sample code in depth","type":"section","role":"pseudoSymbol","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data#Persistence":{"abstract":[{"text":"Users expect their progress and data to persist reliably between launches of an app.","type":"text"},{"text":" ","type":"text"},{"text":"In this article, you’ll learn how Article Accelerator stores content that users create separately from the app’s immutable content.","type":"text"},{"type":"text","text":" "},{"text":"You’ll also discover how the app uses SwiftData to persist user-created content, such as article highlights.","type":"text"}],"title":"Persistence","kind":"section","url":"/tutorials/app-dev-training/swift-data#Persistence","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data#Persistence","role":"pseudoSymbol","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator":{"url":"/tutorials/app-dev-training/getting-started-with-article-accelerator","kind":"article","role":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator","title":"Getting started with Article Accelerator","type":"topic","estimatedTime":"10min","abstract":[{"text":"Explore SwiftUI sample code to learn how to build a desktop-class macOS app.","type":"text"},{"type":"text","text":" "},{"text":"Learn about the development and design principles that make an app feel at home on Mac.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/System-frameworks":{"url":"/tutorials/app-dev-training/uikit/system-frameworks","title":"System frameworks","abstract":[],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/System-frameworks","type":"topic","role":"article","kind":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training":{"abstract":[{"type":"text","text":"Learn the basics of Xcode, SwiftUI, and UIKit to create compelling apps."}],"url":"/tutorials/app-dev-training","type":"topic","kind":"overview","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training","title":"Develop apps for Apple platforms","role":"overview"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Creating-more-apps":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Creating-more-apps","abstract":[{"type":"text","text":"You completed this module on SwiftUI and built your first app. Review what you’ve learned, and get ideas about where to go from here."}],"url":"/tutorials/app-dev-training/finding-more-resources#Creating-more-apps","type":"section","kind":"section","title":"Creating more apps","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data#Create-sample-SwiftData-for-previews":{"abstract":[{"type":"text","text":"Users can now create and edit scrums, and SwiftUI automatically keeps the app’s user interface up to date."},{"type":"text","text":" "},{"text":"However, quitting and relaunching Scrumdinger resets all data back to its initial state.","type":"text"}],"type":"section","kind":"section","url":"/tutorials/app-dev-training/persisting-data#Create-sample-SwiftData-for-previews","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data#Create-sample-SwiftData-for-previews","title":"Create sample SwiftData for previews","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view#Show-quake-details":{"kind":"section","abstract":[{"type":"text","text":"Earthquakes displays a list, with each element showing a sample of the available information for a recent earthquake."},{"type":"text","text":" "},{"type":"text","text":"When the user taps a quake in the list, you’ll provide detailed information about that quake in a view that transitions onscreen."}],"role":"pseudoSymbol","title":"Show quake details","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view#Show-quake-details","url":"/tutorials/app-dev-training/adding-the-detail-view#Show-quake-details","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Configure-the-collection-as-a-list":{"kind":"section","url":"/tutorials/app-dev-training/creating-a-list-view#Configure-the-collection-as-a-list","title":"Configure the collection as a list","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Configure-the-collection-as-a-list","abstract":[{"type":"text","text":"In this tutorial, you’ll create your app’s root view, a collection view with a list layout that displays the user’s daily reminders."}],"type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/State-management":{"url":"/tutorials/app-dev-training/swiftui/state-management","abstract":[],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/State-management","title":"State management","type":"topic","role":"article","kind":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Ensuring-toolbar-accessibility":{"role":"pseudoSymbol","title":"Ensuring toolbar accessibility","url":"/tutorials/app-dev-training/working-with-toolbars#Ensuring-toolbar-accessibility","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Ensuring-toolbar-accessibility","type":"section","abstract":[{"type":"text","text":"A macOS window has a toolbar at the top of the window’s frame."},{"text":" ","type":"text"},{"text":"This area displays the title of the window and provides a space for controls and other tools that can access features in your app.","type":"text"}],"kind":"section"},"https://developer.apple.com/forums/tags/swiftui":{"url":"https://developer.apple.com/forums/tags/swiftui","titleInlineContent":[{"type":"text","text":"Apple Developer Forums"}],"identifier":"https://developer.apple.com/forums/tags/swiftui","title":"Apple Developer Forums","type":"link"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Set-up-the-data-source":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Set-up-the-data-source","url":"/tutorials/app-dev-training/displaying-reminder-details#Set-up-the-data-source","abstract":[{"text":"Every reminder has properties that make it unique.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"In this tutorial, you’ll create a detail view controller that displays the details of a reminder in a list collection view."}],"role":"pseudoSymbol","type":"section","title":"Set up the data source","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Change-the-cell-background-color":{"title":"Change the cell background color","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Change-the-cell-background-color","type":"section","kind":"section","abstract":[{"type":"text","text":"Today uses a collection view to display a list of reminders in a sequence of cells."}],"url":"/tutorials/app-dev-training/displaying-cell-info#Change-the-cell-background-color","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Custom-views-and-animation":{"abstract":[],"type":"topic","url":"/tutorials/app-dev-training/uikit/custom-views-and-animation","title":"Custom views and animation","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Custom-views-and-animation","kind":"article","role":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/updating-app-data#Add-scrum-history":{"url":"/tutorials/app-dev-training/updating-app-data#Add-scrum-history","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/updating-app-data#Add-scrum-history","type":"section","abstract":[{"text":"In this tutorial, you’ll add two new features to Scrumdinger.","type":"text"},{"text":" ","type":"text"},{"text":"First, you’ll add a view to create new daily scrum meetings.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Then, you’ll update the meeting timer to keep track of past meetings."}],"title":"Add scrum history","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Remove-reminders":{"url":"/tutorials/app-dev-training/saving-reminders#Remove-reminders","kind":"section","abstract":[{"type":"text","text":"You still have some important features to add to your app."},{"type":"text","text":" "},{"type":"text","text":"When Today closes, it loses changes that the user made within the app."},{"type":"text","text":" "},{"type":"text","text":"And it doesn’t automatically reflect changes the user makes outside of the app."}],"role":"pseudoSymbol","type":"section","title":"Remove reminders","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Remove-reminders"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Experimenting-with-unavailable-menu-commands":{"role":"pseudoSymbol","title":"Experimenting with unavailable menu commands","kind":"section","type":"section","abstract":[{"text":"Menu bars and keyboard shortcuts are ubiquitous to the macOS experience.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Although users can directly interact with UI elements, macOS apps support alternate workflows by surfacing frequent actions in an app’s menu or with keyboard shortcuts."}],"url":"/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Experimenting-with-unavailable-menu-commands","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Experimenting-with-unavailable-menu-commands"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Delete-a-reminder":{"abstract":[{"text":"In this tutorial, you’ll add the ability to create new reminders and delete existing ones.","type":"text"}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Delete-a-reminder","title":"Delete a reminder","kind":"section","type":"section","url":"/tutorials/app-dev-training/adding-and-deleting-reminders#Delete-a-reminder"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/navigating-the-sample-project":{"type":"topic","role":"project","estimatedTime":"10min","abstract":[{"type":"text","text":"Welcome to the Article Accelerator app."},{"type":"text","text":" "},{"text":"In this tutorial, you’ll explore how the project is organized, run the completed app, and test some user flows.","type":"text"}],"url":"/tutorials/app-dev-training/navigating-the-sample-project","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/navigating-the-sample-project","title":"Navigating the sample project","kind":"project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Auxiliary-windows":{"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Auxiliary-windows","title":"Auxiliary windows","abstract":[{"type":"text","text":"Mac users expect to use multiple windows to multitask, quickly switch between frequently used features of an app, or work with multiple pieces of an app’s content at the same time."},{"type":"text","text":" "},{"text":"A window can contain a title, toolbar, menu commands, and keyboard shortcuts to help users work efficiently.","type":"text"}],"role":"pseudoSymbol","kind":"section","url":"/tutorials/app-dev-training/supporting-multiple-windows#Auxiliary-windows"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-gradient-background":{"role":"project","abstract":[{"type":"text","text":"Color is an important aspect of app design and can help establish visual consistency, communicate functionality, and align with brand identity."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-gradient-background","type":"topic","url":"/tutorials/app-dev-training/creating-a-gradient-background","title":"Creating a gradient background","estimatedTime":"10min","kind":"project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Using-modern-collection-views-in-Today":{"title":"Using modern collection views in Today","kind":"section","url":"/tutorials/app-dev-training/adopting-collection-views#Using-modern-collection-views-in-Today","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Using-modern-collection-views-in-Today","abstract":[{"type":"text","text":"Collection views manage ordered collections of data items and use customizable layouts to present them."}],"type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Experimenting-with-tips":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Experimenting-with-tips","url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Experimenting-with-tips","role":"pseudoSymbol","type":"section","kind":"section","title":"Experimenting with tips","abstract":[{"text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Connect-the-target-action-pair":{"kind":"section","title":"Connect the target-action pair","url":"/tutorials/app-dev-training/adding-and-deleting-reminders#Connect-the-target-action-pair","role":"pseudoSymbol","abstract":[{"type":"text","text":"In this tutorial, you’ll add the ability to create new reminders and delete existing ones."}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Connect-the-target-action-pair"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Researching-design":{"abstract":[{"type":"text","text":"You completed this introduction to UIKit and built a complete app that integrates with Reminders."},{"type":"text","text":" "},{"type":"text","text":"Review what you’ve learned and get ideas about where to go from here."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Researching-design","url":"/tutorials/app-dev-training/continuing-your-learning#Researching-design","title":"Researching design","type":"section","kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Making-apps-for-everyone":{"title":"Making apps for everyone","type":"section","abstract":[{"text":"Explore aspects of the app’s user experience and visual design.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way."},{"text":" ","type":"text"},{"type":"text","text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Making-apps-for-everyone","kind":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/exploring-app-design#Making-apps-for-everyone"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Defining-Article-Accelerator-settings":{"abstract":[{"text":"macOS apps often offer users a way to customize their experience.","type":"text"},{"text":" ","type":"text"},{"text":"Learn about the different areas where you can surface app settings.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Examine how Article Accelerator creates an app-specific settings window."}],"kind":"section","title":"Defining Article Accelerator settings","url":"/tutorials/app-dev-training/displaying-app-settings#Defining-Article-Accelerator-settings","role":"pseudoSymbol","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Defining-Article-Accelerator-settings"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-data-in-a-list#Make-scrums-identifiable":{"abstract":[{"type":"codeVoice","code":"List"},{"text":" is a container view that displays rows of data arranged in a single, scrollable column.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this tutorial, you’ll use a "},{"type":"codeVoice","code":"List"},{"text":" view to display a summary of the user’s daily scrums.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Then, you’ll make the list the main screen of the app."}],"url":"/tutorials/app-dev-training/displaying-data-in-a-list#Make-scrums-identifiable","type":"section","role":"pseudoSymbol","kind":"section","title":"Make scrums identifiable","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-data-in-a-list#Make-scrums-identifiable"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views":{"role":"article","title":"Managing content views","kind":"article","url":"/tutorials/app-dev-training/managing-content-views","estimatedTime":"5min","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views","abstract":[{"type":"text","text":"Content views let you focus on information that you want to display in a view, without worrying about when to update or how to style a view."},{"type":"text","text":" "},{"text":"They work with content configurations to keep your app’s information and user interface in sync.","type":"text"}],"type":"topic"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Removing-elements-from-a-relationship":{"title":"Removing elements from a relationship","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Removing-elements-from-a-relationship","role":"pseudoSymbol","url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Removing-elements-from-a-relationship","type":"section","abstract":[{"type":"text","text":"In the previous article, you examined how to define your app’s storage schema in its model code."},{"type":"text","text":" "},{"type":"text","text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data."}],"kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data#Article-state":{"url":"/tutorials/app-dev-training/swift-data#Article-state","type":"section","abstract":[{"type":"text","text":"Users expect their progress and data to persist reliably between launches of an app."},{"text":" ","type":"text"},{"text":"In this article, you’ll learn how Article Accelerator stores content that users create separately from the app’s immutable content.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll also discover how the app uses SwiftData to persist user-created content, such as article highlights.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data#Article-state","kind":"section","role":"pseudoSymbol","title":"Article state"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Reordering-dynamic-content":{"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Reordering-dynamic-content","abstract":[{"text":"On macOS, users can drag an item from one place in an app to another location.","type":"text"},{"text":" ","type":"text"},{"text":"With these drag-and-drop operations, users can perform actions like moving or copying an item.","type":"text"}],"kind":"section","url":"/tutorials/app-dev-training/supporting-drag-and-drop#Reordering-dynamic-content","title":"Reordering dynamic content","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events":{"role":"article","title":"Responding to events","abstract":[{"type":"text","text":"As you’ve learned so far in this module, you can use SwiftUI property wrappers to manage state in your app’s user interface and respond to user interaction."},{"text":" ","type":"text"},{"text":"But how do you perform actions in response to changes in app state?","type":"text"}],"estimatedTime":"5min","kind":"article","url":"/tutorials/app-dev-training/responding-to-events","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events","type":"topic"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-structured-concurrency#Protecting-data-with-actors":{"title":"Protecting data with actors","abstract":[{"text":"Earthquakes fetches network data asynchronously.","type":"text"},{"text":" ","type":"text"},{"text":"In the following tutorials, you’ll update the app to make additional network requests to fetch the details of each earthquake.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"You’ll update the client to make multiple network requests concurrently."}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-structured-concurrency#Protecting-data-with-actors","kind":"section","url":"/tutorials/app-dev-training/managing-structured-concurrency#Protecting-data-with-actors","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Defining-actions":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Defining-actions","kind":"section","title":"Defining actions","url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Defining-actions","role":"pseudoSymbol","abstract":[{"type":"text","text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app."},{"text":" ","type":"text"},{"text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app.","type":"text"}],"type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view#Draw-the-progress-ring":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view#Draw-the-progress-ring","type":"section","abstract":[{"type":"text","text":"Scrumdinger tracks progress during daily scrum meetings, giving each attendee an equal amount of speaking time."}],"url":"/tutorials/app-dev-training/drawing-the-timer-view#Draw-the-progress-ring","kind":"section","title":"Draw the progress ring","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Create-a-history-view":{"role":"pseudoSymbol","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Create-a-history-view","title":"Create a history view","abstract":[{"text":"In this tutorial, you’ll add a feature to Scrumdinger that captures and logs meeting transcripts.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"You’ll request access to device hardware like the microphone and integrate the Speech framework to transcribe live audio to text."}],"type":"section","url":"/tutorials/app-dev-training/transcribing-speech-to-text#Create-a-history-view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Speech-recognizer-architecture":{"type":"section","role":"pseudoSymbol","kind":"section","abstract":[{"type":"text","text":"Scrumdinger includes two model objects in the starter projects: "},{"type":"codeVoice","code":"ScrumTimer"},{"type":"text","text":" and "},{"code":"SpeechRecognizer","type":"codeVoice"},{"text":".","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"These objects manage dynamic data that display in the Scrumdinger interface."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Speech-recognizer-architecture","url":"/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Speech-recognizer-architecture","title":"Speech recognizer architecture"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Test-the-decoder":{"kind":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/decoding-structured-json#Test-the-decoder","type":"section","abstract":[{"type":"text","text":"In this tutorial, you’ll use Swift APIs to decode earthquake information that the USGS provides."},{"text":" ","type":"text"},{"type":"text","text":"The USGS encodes the earthquake observations in JSON format, which is a popular choice for providing data on the web."},{"type":"text","text":" "},{"text":"You’ll access child objects within a JSON hierarchy and ignore fields your app doesn’t need.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Test-the-decoder","title":"Test the decoder"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders":{"abstract":[{"text":"With the EventKit framework, you can request access to a user’s calendar events and reminders.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You can use EventKit to share data between the Reminders and Today apps."}],"kind":"project","title":"Loading reminders","role":"project","type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders","estimatedTime":"40min","url":"/tutorials/app-dev-training/loading-reminders"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#Whats-next":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#Whats-next","abstract":[{"text":"Article Accelerator acts on a mixture of immutable data that a service provides and mutable data that a user creates.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll investigate the app’s structure and learn how data flows in and through the app.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll also learn how Article Accelerator organizes that data into various types.","type":"text"}],"url":"/tutorials/app-dev-training/dissecting-an-apps-architecture#Whats-next","kind":"section","type":"section","role":"pseudoSymbol","title":"What’s next?"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#Scene-phases-and-transitions":{"role":"pseudoSymbol","kind":"section","url":"/tutorials/app-dev-training/responding-to-events#Scene-phases-and-transitions","title":"Scene phases and transitions","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#Scene-phases-and-transitions","abstract":[{"text":"As you’ve learned so far in this module, you can use SwiftUI property wrappers to manage state in your app’s user interface and respond to user interaction.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"But how do you perform actions in response to changes in app state?"}],"type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Experimenting-with-SwiftData":{"url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Experimenting-with-SwiftData","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Experimenting-with-SwiftData","role":"pseudoSymbol","kind":"section","abstract":[{"type":"text","text":"In the previous article, you examined how to define your app’s storage schema in its model code."},{"text":" ","type":"text"},{"text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data.","type":"text"}],"type":"section","title":"Experimenting with SwiftData"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Time-to-begin":{"abstract":[{"text":"Explore SwiftUI sample code to learn how to build a desktop-class macOS app.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Learn about the development and design principles that make an app feel at home on Mac."}],"role":"pseudoSymbol","type":"section","url":"/tutorials/app-dev-training/getting-started-with-article-accelerator#Time-to-begin","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Time-to-begin","title":"Time to begin"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#Time-to-begin":{"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#Time-to-begin","title":"Time to begin","abstract":[{"type":"text","text":"Learn the essentials of iOS app development by building a fully functional app using SwiftUI."}],"role":"pseudoSymbol","kind":"section","url":"/tutorials/app-dev-training/getting-started-with-scrumdinger#Time-to-begin"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture":{"role":"article","abstract":[{"text":"Article Accelerator acts on a mixture of immutable data that a service provides and mutable data that a user creates.","type":"text"},{"type":"text","text":" "},{"text":"You’ll investigate the app’s structure and learn how data flows in and through the app.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"You’ll also learn how Article Accelerator organizes that data into various types."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture","type":"topic","url":"/tutorials/app-dev-training/dissecting-an-apps-architecture","estimatedTime":"5min","title":"Dissecting an app's architecture","kind":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Convert-between-model-types":{"abstract":[{"text":"With the EventKit framework, you can request access to a user’s calendar events and reminders.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You can use EventKit to share data between the Reminders and Today apps."}],"title":"Convert between model types","kind":"section","role":"pseudoSymbol","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Convert-between-model-types","url":"/tutorials/app-dev-training/loading-reminders#Convert-between-model-types"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Create-content-views-for-the-date-and-notes":{"abstract":[{"type":"text","text":"In this tutorial, you’ll add capabilities to the app’s editing mode that transform a view-only list of reminder details into editable controls."}],"type":"section","url":"/tutorials/app-dev-training/using-content-views#Create-content-views-for-the-date-and-notes","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Create-content-views-for-the-date-and-notes","title":"Create content views for the date and notes","kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Using-inline-tips-in-Article-Accelerator":{"title":"Using inline tips in Article Accelerator","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Using-inline-tips-in-Article-Accelerator","kind":"section","abstract":[{"text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app.","type":"text"},{"type":"text","text":" "},{"text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app.","type":"text"}],"type":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Using-inline-tips-in-Article-Accelerator"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Display-the-header-view":{"url":"/tutorials/app-dev-training/creating-a-progress-view#Display-the-header-view","title":"Display the header view","kind":"section","abstract":[{"type":"text","text":"Create a progress view in Today so that users can track the percentage of reminders they’ve completed."}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Display-the-header-view","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Drawing":{"role":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Drawing","url":"/tutorials/app-dev-training/swiftui/drawing","type":"topic","abstract":[],"title":"Drawing","kind":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view#Display-the-location-details":{"abstract":[{"text":"Earthquakes displays a list, with each element showing a sample of the available information for a recent earthquake.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"When the user taps a quake in the list, you’ll provide detailed information about that quake in a view that transitions onscreen."}],"kind":"section","title":"Display the location details","url":"/tutorials/app-dev-training/adding-the-detail-view#Display-the-location-details","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view#Display-the-location-details","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Restricting-line-length-for-readability":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Restricting-line-length-for-readability","role":"pseudoSymbol","type":"section","kind":"section","url":"/tutorials/app-dev-training/exploring-app-design#Restricting-line-length-for-readability","abstract":[{"type":"text","text":"Explore aspects of the app’s user experience and visual design."},{"type":"text","text":" "},{"text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app."}],"title":"Restricting line length for readability"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Set-up-a-snapshot":{"abstract":[{"text":"Every reminder has properties that make it unique.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"In this tutorial, you’ll create a detail view controller that displays the details of a reminder in a list collection view."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Set-up-a-snapshot","title":"Set up a snapshot","role":"pseudoSymbol","url":"/tutorials/app-dev-training/displaying-reminder-details#Set-up-a-snapshot","type":"section","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#Events-and-state":{"abstract":[{"text":"As you’ve learned so far in this module, you can use SwiftUI property wrappers to manage state in your app’s user interface and respond to user interaction.","type":"text"},{"text":" ","type":"text"},{"text":"But how do you perform actions in response to changes in app state?","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#Events-and-state","title":"Events and state","type":"section","url":"/tutorials/app-dev-training/responding-to-events#Events-and-state","role":"pseudoSymbol","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Add-life-cycle-events":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Add-life-cycle-events","kind":"section","title":"Add life cycle events","url":"/tutorials/app-dev-training/managing-state-and-life-cycle#Add-life-cycle-events","role":"pseudoSymbol","type":"section","abstract":[{"type":"text","text":"Scrumdinger keeps you informed as your scrum changes."},{"type":"text","text":" "},{"type":"text","text":"To build this key feature in the app, you’ll use life cycle methods to control a model that manages the scrum state."}]},"SUI000_001.png":{"alt":"Screenshot of list of scrums under Daily Scrums heading","variants":[{"url":"https://docs-assets.developer.apple.com/published/1b7e9a5e2f529dc388ba1875d1b50b9c/SUI000_001.png","traits":["1x","light"]},{"traits":["2x","light"],"url":"https://docs-assets.developer.apple.com/published/0f264bd8604372205a58aaf491aa91a8/SUI000_001%402x.png"},{"url":"https://docs-assets.developer.apple.com/published/0c81b77e862e853525e9016a334422c1/SUI000_001~dark.png","traits":["1x","dark"]},{"url":"https://docs-assets.developer.apple.com/published/2aa0db57f788f02ec7c87bf0068f06ac/SUI000_001~dark%402x.png","traits":["2x","dark"]}],"type":"image","identifier":"SUI000_001.png"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Add-a-collection-view-controller":{"role":"pseudoSymbol","abstract":[{"text":"In this tutorial, you’ll create your app’s root view, a collection view with a list layout that displays the user’s daily reminders.","type":"text"}],"type":"section","kind":"section","url":"/tutorials/app-dev-training/creating-a-list-view#Add-a-collection-view-controller","title":"Add a collection view controller","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Add-a-collection-view-controller"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Scrum-timer-meeting-properties":{"abstract":[{"type":"text","text":"Scrumdinger includes two model objects in the starter projects: "},{"type":"codeVoice","code":"ScrumTimer"},{"text":" and ","type":"text"},{"type":"codeVoice","code":"SpeechRecognizer"},{"type":"text","text":"."},{"type":"text","text":" "},{"text":"These objects manage dynamic data that display in the Scrumdinger interface.","type":"text"}],"kind":"section","url":"/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Scrum-timer-meeting-properties","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Scrum-timer-meeting-properties","role":"pseudoSymbol","type":"section","title":"Scrum timer meeting properties"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#What-youve-learned":{"title":"What you’ve learned","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#What-youve-learned","abstract":[{"type":"text","text":"You’ve taken the next steps as a developer. Review what you’ve learned, and get ideas about where to go from here."}],"role":"pseudoSymbol","kind":"section","url":"/tutorials/app-dev-training/refining-your-craft#What-youve-learned","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Passing-data":{"type":"topic","role":"article","kind":"article","url":"/tutorials/app-dev-training/swiftui/passing-data","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Passing-data","title":"Passing data","abstract":[]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Other-frameworks":{"abstract":[],"role":"article","type":"topic","url":"/tutorials/app-dev-training/macos/other-frameworks","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Other-frameworks","kind":"article","title":"Other frameworks"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views":{"url":"/tutorials/app-dev-training/adopting-collection-views","role":"article","estimatedTime":"5min","kind":"article","abstract":[{"text":"Collection views manage ordered collections of data items and use customizable layouts to present them.","type":"text"}],"type":"topic","title":"Adopting collection views","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#Tips-for-success":{"abstract":[{"text":"Learn to develop a fully functional app with the UIKit framework.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#Tips-for-success","url":"/tutorials/app-dev-training/getting-started-with-today#Tips-for-success","kind":"section","title":"Tips for success","role":"pseudoSymbol","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Create-a-daily-scrum-model":{"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Create-a-daily-scrum-model","abstract":[{"text":"Scrumdinger keeps a list of daily scrums that the user attends, and it displays that list in its root view.","type":"text"}],"title":"Create a daily scrum model","type":"section","kind":"section","url":"/tutorials/app-dev-training/creating-a-card-view#Create-a-daily-scrum-model"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Whats-next":{"type":"section","abstract":[{"text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app."}],"title":"What’s next?","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Whats-next","role":"pseudoSymbol","url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Whats-next","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Designing-for-the-network":{"kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Designing-for-the-network","abstract":[{"text":"You’ve taken the next steps as a developer. Review what you’ve learned, and get ideas about where to go from here.","type":"text"}],"role":"pseudoSymbol","url":"/tutorials/app-dev-training/refining-your-craft#Designing-for-the-network","type":"section","title":"Designing for the network"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Present-the-edit-view":{"role":"pseudoSymbol","url":"/tutorials/app-dev-training/creating-the-edit-view#Present-the-edit-view","title":"Present the edit view","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Present-the-edit-view","type":"section","abstract":[{"text":"In this tutorial, you’ll create a new view containing controls to edit a scrum.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"SwiftUI provides all the standard controls for iOS apps."},{"type":"text","text":" "},{"text":"You’ll add buttons, a slider, and a text field.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Then, you’ll update the detail view to present your new edit view."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Enabling-toolbar-customization":{"kind":"section","abstract":[{"type":"text","text":"A macOS window has a toolbar at the top of the window’s frame."},{"text":" ","type":"text"},{"text":"This area displays the title of the window and provides a space for controls and other tools that can access features in your app.","type":"text"}],"url":"/tutorials/app-dev-training/working-with-toolbars#Enabling-toolbar-customization","type":"section","title":"Enabling toolbar customization","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Enabling-toolbar-customization"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/SwiftUI-essentials":{"abstract":[],"type":"topic","title":"SwiftUI essentials","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/SwiftUI-essentials","url":"/tutorials/app-dev-training/swiftui/swiftui-essentials","role":"article","kind":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Fetch-reminders-asynchronously":{"type":"section","role":"pseudoSymbol","title":"Fetch reminders asynchronously","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Fetch-reminders-asynchronously","abstract":[{"type":"text","text":"With the EventKit framework, you can request access to a user’s calendar events and reminders."},{"type":"text","text":" "},{"text":"You can use EventKit to share data between the Reminders and Today apps.","type":"text"}],"url":"/tutorials/app-dev-training/loading-reminders#Fetch-reminders-asynchronously","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Monitoring-an-object-for-changes":{"type":"section","abstract":[{"text":"You’ve used the ","type":"text"},{"code":"@State","type":"codeVoice"},{"type":"text","text":" and "},{"type":"codeVoice","code":"@Binding"},{"text":" property wrappers to define a value type as a source of truth for triggering updates in your view hierarchy.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll learn how to define a reference type as a source of truth for your app’s user interface."}],"kind":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/making-classes-observable#Monitoring-an-object-for-changes","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Monitoring-an-object-for-changes","title":"Monitoring an object for changes"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Creating-a-window-group-for-data-driven-windows":{"title":"Creating a window group for data-driven windows","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Creating-a-window-group-for-data-driven-windows","role":"pseudoSymbol","url":"/tutorials/app-dev-training/supporting-multiple-windows#Creating-a-window-group-for-data-driven-windows","kind":"section","abstract":[{"text":"Mac users expect to use multiple windows to multitask, quickly switch between frequently used features of an app, or work with multiple pieces of an app’s content at the same time.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"A window can contain a title, toolbar, menu commands, and keyboard shortcuts to help users work efficiently."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Create-a-reusable-layout-function":{"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Create-a-reusable-layout-function","abstract":[{"text":"In this tutorial, you’ll add capabilities to the app’s editing mode that transform a view-only list of reminder details into editable controls.","type":"text"}],"url":"/tutorials/app-dev-training/using-content-views#Create-a-reusable-layout-function","type":"section","kind":"section","title":"Create a reusable layout function"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#What-youve-learned":{"url":"/tutorials/app-dev-training/continuing-your-learning#What-youve-learned","role":"pseudoSymbol","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#What-youve-learned","type":"section","title":"What you’ve learned","abstract":[{"text":"You completed this introduction to UIKit and built a complete app that integrates with Reminders.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Review what you’ve learned and get ideas about where to go from here."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#View-life-cycle-events":{"url":"/tutorials/app-dev-training/responding-to-events#View-life-cycle-events","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#View-life-cycle-events","abstract":[{"text":"As you’ve learned so far in this module, you can use SwiftUI property wrappers to manage state in your app’s user interface and respond to user interaction.","type":"text"},{"text":" ","type":"text"},{"text":"But how do you perform actions in response to changes in app state?","type":"text"}],"kind":"section","title":"View life cycle events","role":"pseudoSymbol","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#Tour-of-the-app":{"url":"/tutorials/app-dev-training/getting-started-with-scrumdinger#Tour-of-the-app","type":"section","kind":"section","role":"pseudoSymbol","title":"Tour of the app","abstract":[{"text":"Learn the essentials of iOS app development by building a fully functional app using SwiftUI.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#Tour-of-the-app"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Create-a-project":{"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Create-a-project","kind":"section","url":"/tutorials/app-dev-training/creating-a-list-view#Create-a-project","role":"pseudoSymbol","abstract":[{"type":"text","text":"In this tutorial, you’ll create your app’s root view, a collection view with a list layout that displays the user’s daily reminders."}],"title":"Create a project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Removing-existing-commands":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Removing-existing-commands","role":"pseudoSymbol","type":"section","kind":"section","url":"/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Removing-existing-commands","abstract":[{"text":"Menu bars and keyboard shortcuts are ubiquitous to the macOS experience.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Although users can directly interact with UI elements, macOS apps support alternate workflows by surfacing frequent actions in an app’s menu or with keyboard shortcuts."}],"title":"Removing existing commands"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view#Add-the-map-view":{"kind":"section","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-the-detail-view#Add-the-map-view","role":"pseudoSymbol","url":"/tutorials/app-dev-training/adding-the-detail-view#Add-the-map-view","abstract":[{"type":"text","text":"Earthquakes displays a list, with each element showing a sample of the available information for a recent earthquake."},{"type":"text","text":" "},{"text":"When the user taps a quake in the list, you’ll provide detailed information about that quake in a view that transitions onscreen.","type":"text"}],"title":"Add the map view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Defining-a-draggable-source-view":{"type":"section","abstract":[{"text":"On macOS, users can drag an item from one place in an app to another location.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"With these drag-and-drop operations, users can perform actions like moving or copying an item."}],"url":"/tutorials/app-dev-training/supporting-drag-and-drop#Defining-a-draggable-source-view","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Defining-a-draggable-source-view","kind":"section","role":"pseudoSymbol","title":"Defining a draggable source view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Create-functions-for-accessing-the-model":{"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Create-functions-for-accessing-the-model","kind":"section","title":"Create functions for accessing the model","abstract":[{"type":"text","text":"A "},{"type":"emphasis","inlineContent":[{"text":"diffable data source","type":"text"}]},{"type":"text","text":" stores a list of identifiers that represents the identities of the items in the collection view."},{"type":"text","text":" "},{"type":"text","text":"In this tutorial, you’ll make the reminder model "},{"type":"emphasis","inlineContent":[{"text":"identifiable","type":"text"}]},{"type":"text","text":" so that you can uniquely identify each reminder."}],"type":"section","url":"/tutorials/app-dev-training/making-reminders-identifiable#Create-functions-for-accessing-the-model"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Considering-design":{"url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Considering-design","title":"Considering design","kind":"section","type":"section","abstract":[{"type":"text","text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app."},{"type":"text","text":" "},{"text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Considering-design","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Supplementing-commands-with-keyboard-shortcuts":{"title":"Supplementing commands with keyboard shortcuts","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Supplementing-commands-with-keyboard-shortcuts","type":"section","url":"/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Supplementing-commands-with-keyboard-shortcuts","kind":"section","role":"pseudoSymbol","abstract":[{"text":"Menu bars and keyboard shortcuts are ubiquitous to the macOS experience.","type":"text"},{"text":" ","type":"text"},{"text":"Although users can directly interact with UI elements, macOS apps support alternate workflows by surfacing frequent actions in an app’s menu or with keyboard shortcuts.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#App-structure-and-responsibilities":{"kind":"section","title":"App structure and responsibilities","type":"section","abstract":[{"text":"Article Accelerator acts on a mixture of immutable data that a service provides and mutable data that a user creates.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll investigate the app’s structure and learn how data flows in and through the app.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll also learn how Article Accelerator organizes that data into various types.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#App-structure-and-responsibilities","url":"/tutorials/app-dev-training/dissecting-an-apps-architecture#App-structure-and-responsibilities","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Creating-the-model-container-and-context":{"abstract":[{"type":"text","text":"In the previous article, you examined how to define your app’s storage schema in its model code."},{"type":"text","text":" "},{"type":"text","text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data."}],"role":"pseudoSymbol","type":"section","url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Creating-the-model-container-and-context","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Creating-the-model-container-and-context","title":"Creating the model container and context"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources":{"estimatedTime":"5min","title":"Finding more resources","url":"/tutorials/app-dev-training/finding-more-resources","type":"topic","kind":"article","abstract":[{"text":"You completed this module on SwiftUI and built your first app. Review what you’ve learned, and get ideas about where to go from here.","type":"text"}],"role":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Create-a-custom-button-action":{"role":"pseudoSymbol","type":"section","abstract":[{"text":"A ","type":"text"},{"inlineContent":[{"text":"diffable data source","type":"text"}],"type":"emphasis"},{"type":"text","text":" stores a list of identifiers that represents the identities of the items in the collection view."},{"type":"text","text":" "},{"text":"In this tutorial, you’ll make the reminder model ","type":"text"},{"type":"emphasis","inlineContent":[{"type":"text","text":"identifiable"}]},{"type":"text","text":" so that you can uniquely identify each reminder."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Create-a-custom-button-action","kind":"section","title":"Create a custom button action","url":"/tutorials/app-dev-training/making-reminders-identifiable#Create-a-custom-button-action"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data#Fetch-quake-location":{"url":"/tutorials/app-dev-training/caching-network-data#Fetch-quake-location","title":"Fetch quake location","kind":"section","type":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data#Fetch-quake-location","abstract":[{"type":"text","text":"Your quake client fetches a list of earthquakes from the network."},{"type":"text","text":" "},{"text":"Now, you’ll extend the client to fetch location details for each earthquake.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Each earthquake requires one additional fetch to retrieve the location information."},{"type":"text","text":" "},{"text":"You’ll make multiple network connections concurrently while maintaining a cache of replies.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Creating-more-apps":{"abstract":[{"type":"text","text":"You’ve completed this module and studied a macOS sample app."},{"text":" ","type":"text"},{"text":"Review what you’ve learned, and get ideas about where to go from here.","type":"text"}],"url":"/tutorials/app-dev-training/growing-your-knowledge#Creating-more-apps","kind":"section","role":"pseudoSymbol","title":"Creating more apps","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Creating-more-apps"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Save-updated-reminders":{"type":"section","abstract":[{"type":"text","text":"You still have some important features to add to your app."},{"text":" ","type":"text"},{"text":"When Today closes, it loses changes that the user made within the app.","type":"text"},{"text":" ","type":"text"},{"text":"And it doesn’t automatically reflect changes the user makes outside of the app.","type":"text"}],"url":"/tutorials/app-dev-training/saving-reminders#Save-updated-reminders","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Save-updated-reminders","role":"pseudoSymbol","title":"Save updated reminders","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Create-the-detail-view":{"kind":"section","title":"Create the detail view","url":"/tutorials/app-dev-training/creating-a-navigation-hierarchy#Create-the-detail-view","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Create-the-detail-view","abstract":[{"text":"You’ve learned how to create SwiftUI views, but you need to know how to navigate between them.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this tutorial, you’ll create a navigation hierarchy."}],"role":"pseudoSymbol","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Read-all-reminders":{"title":"Read all reminders","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Read-all-reminders","type":"section","url":"/tutorials/app-dev-training/loading-reminders#Read-all-reminders","kind":"section","role":"pseudoSymbol","abstract":[{"type":"text","text":"With the EventKit framework, you can request access to a user’s calendar events and reminders."},{"text":" ","type":"text"},{"text":"You can use EventKit to share data between the Reminders and Today apps.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Defining-a-drop-destination":{"type":"section","kind":"section","url":"/tutorials/app-dev-training/supporting-drag-and-drop#Defining-a-drop-destination","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Defining-a-drop-destination","title":"Defining a drop destination","abstract":[{"type":"text","text":"On macOS, users can drag an item from one place in an app to another location."},{"type":"text","text":" "},{"type":"text","text":"With these drag-and-drop operations, users can perform actions like moving or copying an item."}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Create-a-source-of-truth-for-a-reference-type":{"type":"section","title":"Create a source of truth for a reference type","kind":"section","abstract":[{"text":"Scrumdinger keeps you informed as your scrum changes.","type":"text"},{"text":" ","type":"text"},{"text":"To build this key feature in the app, you’ll use life cycle methods to control a model that manages the scrum state.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Create-a-source-of-truth-for-a-reference-type","url":"/tutorials/app-dev-training/managing-state-and-life-cycle#Create-a-source-of-truth-for-a-reference-type","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views":{"estimatedTime":"5min","role":"article","type":"topic","abstract":[{"type":"text","text":"Displaying information to the user and modifying data in response to user interactions are essential functions of most apps."},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll learn how to use "},{"type":"codeVoice","code":"@State"},{"type":"text","text":" and "},{"type":"codeVoice","code":"@Binding"},{"text":" to ensure that your user interface reflects the current state of your app’s data.","type":"text"}],"kind":"article","title":"Managing data flow between views","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views","url":"/tutorials/app-dev-training/managing-data-flow-between-views"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders","url":"/tutorials/app-dev-training/saving-reminders","title":"Saving reminders","kind":"project","estimatedTime":"35min","type":"topic","abstract":[{"type":"text","text":"You still have some important features to add to your app."},{"type":"text","text":" "},{"text":"When Today closes, it loses changes that the user made within the app.","type":"text"},{"text":" ","type":"text"},{"text":"And it doesn’t automatically reflect changes the user makes outside of the app.","type":"text"}],"role":"project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Displaying-tips":{"title":"Displaying tips","role":"pseudoSymbol","url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Displaying-tips","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Displaying-tips","abstract":[{"text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app."}],"kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable":{"type":"topic","url":"/tutorials/app-dev-training/making-reminders-identifiable","abstract":[{"type":"text","text":"A "},{"inlineContent":[{"text":"diffable data source","type":"text"}],"type":"emphasis"},{"type":"text","text":" stores a list of identifiers that represents the identities of the items in the collection view."},{"type":"text","text":" "},{"text":"In this tutorial, you’ll make the reminder model ","type":"text"},{"inlineContent":[{"text":"identifiable","type":"text"}],"type":"emphasis"},{"type":"text","text":" so that you can uniquely identify each reminder."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable","title":"Making reminders identifiable","role":"project","estimatedTime":"35min","kind":"project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Using-model-contexts":{"type":"section","url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Using-model-contexts","abstract":[{"text":"In the previous article, you examined how to define your app’s storage schema in its model code.","type":"text"},{"type":"text","text":" "},{"text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data.","type":"text"}],"role":"pseudoSymbol","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Using-model-contexts","title":"Using model contexts"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Whats-next":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Whats-next","url":"/tutorials/app-dev-training/exploring-app-design#Whats-next","role":"pseudoSymbol","type":"section","kind":"section","title":"What’s next?","abstract":[{"text":"Explore aspects of the app’s user experience and visual design.","type":"text"},{"text":" ","type":"text"},{"text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge":{"role":"article","kind":"article","type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge","title":"Growing your knowledge","estimatedTime":"5min","url":"/tutorials/app-dev-training/growing-your-knowledge","abstract":[{"text":"You’ve completed this module and studied a macOS sample app.","type":"text"},{"text":" ","type":"text"},{"text":"Review what you’ve learned, and get ideas about where to go from here.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Create-a-list-style-enumeration":{"kind":"section","abstract":[{"text":"For users to more easily access their reminders on the Today app’s main view, you’ll create a ","type":"text"},{"code":"ListStyle","type":"codeVoice"},{"text":" enumeration that separates reminders into three categories: Today, Future, and All.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll also add a segmented control that lets users select different styles for the reminders list.","type":"text"}],"type":"section","url":"/tutorials/app-dev-training/filtering-reminders#Create-a-list-style-enumeration","title":"Create a list style enumeration","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Create-a-list-style-enumeration"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-structured-concurrency":{"role":"article","url":"/tutorials/app-dev-training/managing-structured-concurrency","estimatedTime":"15min","kind":"article","abstract":[{"text":"Earthquakes fetches network data asynchronously.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"In the following tutorials, you’ll update the app to make additional network requests to fetch the details of each earthquake."},{"text":" ","type":"text"},{"type":"text","text":"You’ll update the client to make multiple network requests concurrently."}],"title":"Managing structured concurrency","type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-structured-concurrency"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Design":{"abstract":[],"kind":"article","title":"Design","role":"article","type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Design","url":"/tutorials/app-dev-training/macos/design"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client":{"kind":"project","estimatedTime":"25min","role":"project","url":"/tutorials/app-dev-training/building-a-network-test-client","type":"topic","abstract":[{"type":"text","text":"Start building a network client by building a test client."},{"type":"text","text":" "},{"text":"Test and preview your views without a network.","type":"text"}],"title":"Building a network test client","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Core-macOS-features":{"title":"Core macOS features","kind":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Core-macOS-features","abstract":[],"type":"topic","url":"/tutorials/app-dev-training/macos/core-macos-features","role":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Displaying-navigation-cues":{"abstract":[{"text":"Explore aspects of the app’s user experience and visual design.","type":"text"},{"text":" ","type":"text"},{"text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way.","type":"text"},{"text":" ","type":"text"},{"text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Displaying-navigation-cues","url":"/tutorials/app-dev-training/exploring-app-design#Displaying-navigation-cues","type":"section","title":"Displaying navigation cues","kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft":{"abstract":[{"type":"text","text":"You’ve taken the next steps as a developer. Review what you’ve learned, and get ideas about where to go from here."}],"title":"Refining your craft","estimatedTime":"5min","type":"topic","kind":"article","role":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft","url":"/tutorials/app-dev-training/refining-your-craft"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view#Create-the-meeting-timer-view":{"title":"Create the meeting timer view","url":"/tutorials/app-dev-training/drawing-the-timer-view#Create-the-meeting-timer-view","kind":"section","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view#Create-the-meeting-timer-view","abstract":[{"type":"text","text":"Scrumdinger tracks progress during daily scrum meetings, giving each attendee an equal amount of speaking time."}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Navigation":{"kind":"article","type":"topic","abstract":[],"role":"article","url":"/tutorials/app-dev-training/macos/navigation","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/Navigation","title":"Navigation"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Create-an-enumeration-for-rows":{"type":"section","url":"/tutorials/app-dev-training/displaying-reminder-details#Create-an-enumeration-for-rows","kind":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Create-an-enumeration-for-rows","title":"Create an enumeration for rows","abstract":[{"type":"text","text":"Every reminder has properties that make it unique."},{"type":"text","text":" "},{"type":"text","text":"In this tutorial, you’ll create a detail view controller that displays the details of a reminder in a list collection view."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view#Draw-an-arc-segment":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view#Draw-an-arc-segment","type":"section","abstract":[{"text":"Scrumdinger tracks progress during daily scrum meetings, giving each attendee an equal amount of speaking time.","type":"text"}],"kind":"section","url":"/tutorials/app-dev-training/drawing-the-timer-view#Draw-an-arc-segment","role":"pseudoSymbol","title":"Draw an arc segment"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Extract-the-meeting-footer":{"title":"Extract the meeting footer","type":"section","url":"/tutorials/app-dev-training/managing-state-and-life-cycle#Extract-the-meeting-footer","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Extract-the-meeting-footer","kind":"section","abstract":[{"text":"Scrumdinger keeps you informed as your scrum changes.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"To build this key feature in the app, you’ll use life cycle methods to control a model that manages the scrum state."}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Actions-and-values":{"kind":"section","type":"section","url":"/tutorials/app-dev-training/examining-accessibility-in-today#Actions-and-values","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Actions-and-values","title":"Actions and values","abstract":[{"text":"During the development of Today, you’ve created a custom accessibility action, label, and value.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"However, the app takes advantage of many accessibility features by default."}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable":{"estimatedTime":"10min","url":"/tutorials/app-dev-training/making-classes-observable","kind":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable","abstract":[{"type":"text","text":"You’ve used the "},{"type":"codeVoice","code":"@State"},{"type":"text","text":" and "},{"type":"codeVoice","code":"@Binding"},{"text":" property wrappers to define a value type as a source of truth for triggering updates in your view hierarchy.","type":"text"},{"text":" ","type":"text"},{"text":"In this article, you’ll learn how to define a reference type as a source of truth for your app’s user interface.","type":"text"}],"title":"Making classes observable","role":"article","type":"topic"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Configure-the-view-and-editing-modes":{"abstract":[{"type":"text","text":"In this tutorial, you’ll begin implementing an editing mode for Today so that users can modify the details of a reminder they’re viewing."},{"text":" ","type":"text"},{"text":"You’ll configure the data source for view and editing modes, and add a button that transitions between the two modes.","type":"text"}],"kind":"section","type":"section","title":"Configure the view and editing modes","role":"pseudoSymbol","url":"/tutorials/app-dev-training/getting-ready-for-editing#Configure-the-view-and-editing-modes","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Configure-the-view-and-editing-modes"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#SwiftUI-overview":{"kind":"section","abstract":[{"text":"Learn the essentials of iOS app development by building a fully functional app using SwiftUI.","type":"text"}],"url":"/tutorials/app-dev-training/getting-started-with-scrumdinger#SwiftUI-overview","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#SwiftUI-overview","type":"section","title":"SwiftUI overview","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views":{"abstract":[{"type":"text","text":"Create, modify, and combine views to compose your app’s user interface using the SwiftUI declarative syntax."},{"type":"text","text":" "},{"type":"text","text":"You’ll start building Scrumdinger, an app that manages meetings, by arranging groups of views to create the meeting timer screen."},{"text":" ","type":"text"},{"type":"text","text":"As you progress through the module, you’ll revisit the timer screen as you work toward the final design."}],"kind":"project","title":"Using stacks to arrange views","url":"/tutorials/app-dev-training/using-stacks-to-arrange-views","role":"project","type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views","estimatedTime":"15min"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data":{"type":"topic","title":"Caching network data","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data","abstract":[{"text":"Your quake client fetches a list of earthquakes from the network.","type":"text"},{"text":" ","type":"text"},{"text":"Now, you’ll extend the client to fetch location details for each earthquake.","type":"text"},{"text":" ","type":"text"},{"text":"Each earthquake requires one additional fetch to retrieve the location information.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll make multiple network connections concurrently while maintaining a cache of replies.","type":"text"}],"kind":"project","url":"/tutorials/app-dev-training/caching-network-data","role":"project","estimatedTime":"25min"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#ArticleStore-package":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#ArticleStore-package","url":"/tutorials/app-dev-training/dissecting-an-apps-architecture#ArticleStore-package","abstract":[{"text":"Article Accelerator acts on a mixture of immutable data that a service provides and mutable data that a user creates.","type":"text"},{"type":"text","text":" "},{"text":"You’ll investigate the app’s structure and learn how data flows in and through the app.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll also learn how Article Accelerator organizes that data into various types.","type":"text"}],"role":"pseudoSymbol","kind":"section","type":"section","title":"ArticleStore package"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Providing-context-clues":{"url":"/tutorials/app-dev-training/exploring-app-design#Providing-context-clues","role":"pseudoSymbol","abstract":[{"text":"Explore aspects of the app’s user experience and visual design.","type":"text"},{"text":" ","type":"text"},{"text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app."}],"type":"section","title":"Providing context clues","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Providing-context-clues"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Orienting-users-in-your-app":{"abstract":[{"type":"text","text":"Explore aspects of the app’s user experience and visual design."},{"text":" ","type":"text"},{"type":"text","text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way."},{"type":"text","text":" "},{"text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app.","type":"text"}],"kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Orienting-users-in-your-app","type":"section","url":"/tutorials/app-dev-training/exploring-app-design#Orienting-users-in-your-app","title":"Orienting users in your app","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation#Navigating-parallel-categories":{"abstract":[{"text":"An intuitive navigation structure helps organize your app’s user interface so that users can easily find the content they’re looking for.","type":"text"},{"text":" ","type":"text"},{"text":"In this article, you’ll explore how Article Accelerator uses a multicolumn container to guide users through a hierarchy of information.","type":"text"}],"kind":"section","url":"/tutorials/app-dev-training/displaying-multi-column-navigation#Navigating-parallel-categories","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation#Navigating-parallel-categories","title":"Navigating parallel categories","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Make-the-card-view-accessible":{"title":"Make the card view accessible","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Make-the-card-view-accessible","abstract":[{"type":"text","text":"Scrumdinger keeps a list of daily scrums that the user attends, and it displays that list in its root view."}],"url":"/tutorials/app-dev-training/creating-a-card-view#Make-the-card-view-accessible","kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Sorting-articles":{"type":"section","kind":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Sorting-articles","abstract":[{"text":"Previously, you learned how to create a SwiftData model context and add objects to it.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"In this article, you’ll learn how Article Accelerator fetches objects from a persistent store."},{"type":"text","text":" "},{"text":"And you’ll explore how to sort and filter the objects to list only the objects that you want.","type":"text"}],"url":"/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Sorting-articles","title":"Sorting articles"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#The-main-window":{"url":"/tutorials/app-dev-training/supporting-multiple-windows#The-main-window","role":"pseudoSymbol","abstract":[{"text":"Mac users expect to use multiple windows to multitask, quickly switch between frequently used features of an app, or work with multiple pieces of an app’s content at the same time.","type":"text"},{"text":" ","type":"text"},{"text":"A window can contain a title, toolbar, menu commands, and keyboard shortcuts to help users work efficiently.","type":"text"}],"title":"The main window","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#The-main-window","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Adapting-grid-contents-to-fill-a-window":{"type":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/exploring-app-design#Adapting-grid-contents-to-fill-a-window","abstract":[{"type":"text","text":"Explore aspects of the app’s user experience and visual design."},{"type":"text","text":" "},{"text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app."}],"title":"Adapting grid contents to fill a window","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Adapting-grid-contents-to-fill-a-window","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-existentials-and-generics#Comparing-existential-and-generic-types":{"kind":"section","abstract":[{"text":"Earthquakes will use a network client to fetch JSON data from a remote server.","type":"text"},{"text":" ","type":"text"},{"text":"This article introduces generic and existential types that you can use to develop a reusable network client.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"It also explores using these types in tests to ensure the client is robust."},{"type":"text","text":" "},{"type":"text","text":"You’ll consider how these types affect your code’s simplicity and performance."}],"title":"Comparing existential and generic types","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-existentials-and-generics#Comparing-existential-and-generic-types","type":"section","url":"/tutorials/app-dev-training/using-existentials-and-generics#Comparing-existential-and-generic-types","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Contrasting-toolkits":{"kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Contrasting-toolkits","abstract":[{"text":"The AppKit framework provides a powerful and extensive API for building graphical interfaces for macOS apps.","type":"text"},{"text":" ","type":"text"},{"text":"Using AppKit, you’ll create amazing apps that tap into the full power of macOS.","type":"text"}],"type":"section","role":"pseudoSymbol","title":"Contrasting toolkits","url":"/tutorials/app-dev-training/integrating-appkit#Contrasting-toolkits"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Whats-next":{"type":"section","kind":"section","url":"/tutorials/app-dev-training/supporting-multiple-windows#Whats-next","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Whats-next","role":"pseudoSymbol","title":"What’s next?","abstract":[{"text":"Mac users expect to use multiple windows to multitask, quickly switch between frequently used features of an app, or work with multiple pieces of an app’s content at the same time.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"A window can contain a title, toolbar, menu commands, and keyboard shortcuts to help users work efficiently."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders":{"kind":"project","estimatedTime":"30min","role":"project","type":"topic","title":"Editing reminders","url":"/tutorials/app-dev-training/editing-reminders","abstract":[{"type":"text","text":"In this tutorial, you’ll add an editing mode to Today that lets users edit the details of a reminder."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Import-color-themes":{"url":"/tutorials/app-dev-training/creating-a-card-view#Import-color-themes","type":"section","title":"Import color themes","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Import-color-themes","kind":"section","abstract":[{"text":"Scrumdinger keeps a list of daily scrums that the user attends, and it displays that list in its root view.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Timing-of-speech-recognition-actions":{"url":"/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Timing-of-speech-recognition-actions","type":"section","kind":"section","abstract":[{"type":"text","text":"Scrumdinger includes two model objects in the starter projects: "},{"type":"codeVoice","code":"ScrumTimer"},{"text":" and ","type":"text"},{"type":"codeVoice","code":"SpeechRecognizer"},{"text":".","type":"text"},{"type":"text","text":" "},{"type":"text","text":"These objects manage dynamic data that display in the Scrumdinger interface."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Timing-of-speech-recognition-actions","role":"pseudoSymbol","title":"Timing of speech recognition actions"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Pass-the-edit-view-a-binding-to-data":{"title":"Pass the edit view a binding to data","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Pass-the-edit-view-a-binding-to-data","abstract":[{"text":"In the previous tutorial, you used bindings to share data between the edit view and individual UI controls within that view.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Now, you’ll expand the editing capabilities by building a color theme picker using bindings that allow the theme picker and edit views to share their data."}],"url":"/tutorials/app-dev-training/passing-data-with-bindings#Pass-the-edit-view-a-binding-to-data","role":"pseudoSymbol","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger":{"abstract":[{"text":"Learn the essentials of iOS app development by building a fully functional app using SwiftUI.","type":"text"}],"role":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger","kind":"article","type":"topic","estimatedTime":"5min","url":"/tutorials/app-dev-training/getting-started-with-scrumdinger","title":"Getting started with Scrumdinger"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Connecting-with-others":{"abstract":[{"text":"You completed this introduction to UIKit and built a complete app that integrates with Reminders.","type":"text"},{"text":" ","type":"text"},{"text":"Review what you’ve learned and get ideas about where to go from here.","type":"text"}],"role":"pseudoSymbol","url":"/tutorials/app-dev-training/continuing-your-learning#Connecting-with-others","type":"section","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Connecting-with-others","title":"Connecting with others"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Make-the-progress-view-accessible":{"url":"/tutorials/app-dev-training/creating-a-progress-view#Make-the-progress-view-accessible","title":"Make the progress view accessible","kind":"section","abstract":[{"type":"text","text":"Create a progress view in Today so that users can track the percentage of reminders they’ve completed."}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Make-the-progress-view-accessible","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#State":{"abstract":[{"type":"text","text":"Displaying information to the user and modifying data in response to user interactions are essential functions of most apps."},{"type":"text","text":" "},{"text":"In this article, you’ll learn how to use ","type":"text"},{"type":"codeVoice","code":"@State"},{"type":"text","text":" and "},{"code":"@Binding","type":"codeVoice"},{"text":" to ensure that your user interface reflects the current state of your app’s data.","type":"text"}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#State","url":"/tutorials/app-dev-training/managing-data-flow-between-views#State","kind":"section","role":"pseudoSymbol","title":"State"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/drawing-the-timer-view","title":"Drawing the timer view","role":"project","url":"/tutorials/app-dev-training/drawing-the-timer-view","abstract":[{"text":"Scrumdinger tracks progress during daily scrum meetings, giving each attendee an equal amount of speaking time.","type":"text"}],"kind":"project","type":"topic","estimatedTime":"20min"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Display-the-detail-view":{"url":"/tutorials/app-dev-training/displaying-reminder-details#Display-the-detail-view","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Display-the-detail-view","title":"Display the detail view","role":"pseudoSymbol","kind":"section","type":"section","abstract":[{"type":"text","text":"Every reminder has properties that make it unique."},{"type":"text","text":" "},{"text":"In this tutorial, you’ll create a detail view controller that displays the details of a reminder in a list collection view.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Save-reminders-individually":{"type":"section","title":"Save reminders individually","url":"/tutorials/app-dev-training/saving-reminders#Save-reminders-individually","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Save-reminders-individually","abstract":[{"type":"text","text":"You still have some important features to add to your app."},{"text":" ","type":"text"},{"type":"text","text":"When Today closes, it loses changes that the user made within the app."},{"type":"text","text":" "},{"text":"And it doesn’t automatically reflect changes the user makes outside of the app.","type":"text"}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-structured-concurrency#Fetching-multiple-URLs":{"role":"pseudoSymbol","abstract":[{"type":"text","text":"Earthquakes fetches network data asynchronously."},{"text":" ","type":"text"},{"type":"text","text":"In the following tutorials, you’ll update the app to make additional network requests to fetch the details of each earthquake."},{"type":"text","text":" "},{"text":"You’ll update the client to make multiple network requests concurrently.","type":"text"}],"url":"/tutorials/app-dev-training/managing-structured-concurrency#Fetching-multiple-URLs","type":"section","kind":"section","title":"Fetching multiple URLs","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-structured-concurrency#Fetching-multiple-URLs"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Creating-more-apps":{"url":"/tutorials/app-dev-training/refining-your-craft#Creating-more-apps","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Creating-more-apps","abstract":[{"type":"text","text":"You’ve taken the next steps as a developer. Review what you’ve learned, and get ideas about where to go from here."}],"title":"Creating more apps","kind":"section","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data#Whats-next":{"abstract":[{"type":"text","text":"Users expect their progress and data to persist reliably between launches of an app."},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll learn how Article Accelerator stores content that users create separately from the app’s immutable content."},{"type":"text","text":" "},{"text":"You’ll also discover how the app uses SwiftData to persist user-created content, such as article highlights.","type":"text"}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data#Whats-next","kind":"section","type":"section","url":"/tutorials/app-dev-training/swift-data#Whats-next","title":"What’s next?"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Display-reminders":{"kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Display-reminders","url":"/tutorials/app-dev-training/loading-reminders#Display-reminders","role":"pseudoSymbol","title":"Display reminders","type":"section","abstract":[{"text":"With the EventKit framework, you can request access to a user’s calendar events and reminders.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You can use EventKit to share data between the Reminders and Today apps."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders":{"role":"project","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders","url":"/tutorials/app-dev-training/filtering-reminders","kind":"project","abstract":[{"type":"text","text":"For users to more easily access their reminders on the Today app’s main view, you’ll create a "},{"code":"ListStyle","type":"codeVoice"},{"text":" enumeration that separates reminders into three categories: Today, Future, and All.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You’ll also add a segmented control that lets users select different styles for the reminders list."}],"type":"topic","title":"Filtering reminders","estimatedTime":"25min"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Pass-a-binding-into-the-list-view":{"url":"/tutorials/app-dev-training/passing-data-with-bindings#Pass-a-binding-into-the-list-view","role":"pseudoSymbol","kind":"section","abstract":[{"type":"text","text":"In the previous tutorial, you used bindings to share data between the edit view and individual UI controls within that view."},{"type":"text","text":" "},{"text":"Now, you’ll expand the editing capabilities by building a color theme picker using bindings that allow the theme picker and edit views to share their data.","type":"text"}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Pass-a-binding-into-the-list-view","title":"Pass a binding into the list view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#What-youve-learned":{"kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#What-youve-learned","title":"What you’ve learned","abstract":[{"type":"text","text":"You completed this module on SwiftUI and built your first app. Review what you’ve learned, and get ideas about where to go from here."}],"role":"pseudoSymbol","type":"section","url":"/tutorials/app-dev-training/finding-more-resources#What-youve-learned"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation#Whats-next":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation#Whats-next","title":"What’s next?","type":"section","url":"/tutorials/app-dev-training/displaying-multi-column-navigation#Whats-next","abstract":[{"text":"An intuitive navigation structure helps organize your app’s user interface so that users can easily find the content they’re looking for.","type":"text"},{"text":" ","type":"text"},{"text":"In this article, you’ll explore how Article Accelerator uses a multicolumn container to guide users through a hierarchy of information.","type":"text"}],"kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#About-this-module":{"kind":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#About-this-module","url":"/tutorials/app-dev-training/getting-started-with-today#About-this-module","title":"About this module","type":"section","abstract":[{"text":"Learn to develop a fully functional app with the UIKit framework.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#About-this-module":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#About-this-module","type":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/getting-started-with-article-accelerator#About-this-module","kind":"section","abstract":[{"text":"Explore SwiftUI sample code to learn how to build a desktop-class macOS app.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Learn about the development and design principles that make an app feel at home on Mac."}],"title":"About this module"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Using-sort-descriptors":{"kind":"section","title":"Using sort descriptors","abstract":[{"text":"Previously, you learned how to create a SwiftData model context and add objects to it.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll learn how Article Accelerator fetches objects from a persistent store."},{"text":" ","type":"text"},{"text":"And you’ll explore how to sort and filter the objects to list only the objects that you want.","type":"text"}],"url":"/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Using-sort-descriptors","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Using-sort-descriptors","type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Styling-a-toolbar":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Styling-a-toolbar","type":"section","title":"Styling a toolbar","role":"pseudoSymbol","abstract":[{"text":"A macOS window has a toolbar at the top of the window’s frame.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"This area displays the title of the window and provides a space for controls and other tools that can access features in your app."}],"kind":"section","url":"/tutorials/app-dev-training/working-with-toolbars#Styling-a-toolbar"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#Time-to-build-the-app":{"url":"/tutorials/app-dev-training/getting-started-with-today#Time-to-build-the-app","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#Time-to-build-the-app","abstract":[{"text":"Learn to develop a fully functional app with the UIKit framework.","type":"text"}],"kind":"section","type":"section","title":"Time to build the app","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Scrum-timer-data-flow":{"type":"section","kind":"section","title":"Scrum timer data flow","abstract":[{"text":"Scrumdinger includes two model objects in the starter projects: ","type":"text"},{"type":"codeVoice","code":"ScrumTimer"},{"text":" and ","type":"text"},{"type":"codeVoice","code":"SpeechRecognizer"},{"text":".","type":"text"},{"type":"text","text":" "},{"text":"These objects manage dynamic data that display in the Scrumdinger interface.","type":"text"}],"url":"/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Scrum-timer-data-flow","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger#Scrum-timer-data-flow","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Applying-the-custom-content-configuration":{"type":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/managing-content-views#Applying-the-custom-content-configuration","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Applying-the-custom-content-configuration","title":"Applying the custom content configuration","abstract":[{"text":"Content views let you focus on information that you want to display in a view, without worrying about when to update or how to style a view.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"They work with content configurations to keep your app’s information and user interface in sync."}],"kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Style-the-navigation-bar":{"type":"section","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Style-the-navigation-bar","abstract":[{"type":"text","text":"Every reminder has properties that make it unique."},{"type":"text","text":" "},{"text":"In this tutorial, you’ll create a detail view controller that displays the details of a reminder in a list collection view.","type":"text"}],"url":"/tutorials/app-dev-training/displaying-reminder-details#Style-the-navigation-bar","title":"Style the navigation bar","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-gradient-background#Add-the-gradient-layer-to-the-list":{"abstract":[{"type":"text","text":"Color is an important aspect of app design and can help establish visual consistency, communicate functionality, and align with brand identity."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-gradient-background#Add-the-gradient-layer-to-the-list","type":"section","title":"Add the gradient layer to the list","url":"/tutorials/app-dev-training/creating-a-gradient-background#Add-the-gradient-layer-to-the-list","role":"pseudoSymbol","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Special-thanks":{"url":"/tutorials/app-dev-training/getting-started-with-earthquakes#Special-thanks","abstract":[{"type":"text","text":"Take the next steps in app development, and build an app to download, decode, and present data from a network data source."},{"type":"text","text":" "},{"text":"Use SwiftUI to build a simple interface to display dynamic data from a concurrent network client.","type":"text"}],"type":"section","title":"Special thanks","kind":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Special-thanks"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Accessibility-in-Today":{"kind":"section","type":"section","role":"pseudoSymbol","abstract":[{"type":"text","text":"During the development of Today, you’ve created a custom accessibility action, label, and value."},{"type":"text","text":" "},{"text":"However, the app takes advantage of many accessibility features by default.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Accessibility-in-Today","title":"Accessibility in Today","url":"/tutorials/app-dev-training/examining-accessibility-in-today#Accessibility-in-Today"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Recording-audio":{"url":"/tutorials/app-dev-training/swiftui/recording-audio","type":"topic","kind":"article","role":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Recording-audio","title":"Recording audio","abstract":[]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Collection-views-and-navigation":{"title":"Collection views and navigation","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Collection-views-and-navigation","kind":"article","type":"topic","url":"/tutorials/app-dev-training/uikit/collection-views-and-navigation","abstract":[],"role":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Designing-for-everyone":{"url":"/tutorials/app-dev-training/finding-more-resources#Designing-for-everyone","type":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Designing-for-everyone","abstract":[{"type":"text","text":"You completed this module on SwiftUI and built your first app. Review what you’ve learned, and get ideas about where to go from here."}],"title":"Designing for everyone","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text":{"url":"/tutorials/app-dev-training/transcribing-speech-to-text","title":"Transcribing speech to text","abstract":[{"text":"In this tutorial, you’ll add a feature to Scrumdinger that captures and logs meeting transcripts.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You’ll request access to device hardware like the microphone and integrate the Speech framework to transcribe live audio to text."}],"role":"project","type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text","estimatedTime":"25min","kind":"project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/macOS-essentials":{"kind":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/macOS-essentials","title":"macOS essentials","url":"/tutorials/app-dev-training/macos/macos-essentials","abstract":[],"type":"topic","role":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data":{"estimatedTime":"10min","url":"/tutorials/app-dev-training/swift-data","kind":"article","type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swift-data","abstract":[{"type":"text","text":"Users expect their progress and data to persist reliably between launches of an app."},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll learn how Article Accelerator stores content that users create separately from the app’s immutable content."},{"text":" ","type":"text"},{"text":"You’ll also discover how the app uses SwiftData to persist user-created content, such as article highlights.","type":"text"}],"title":"Persisting user data","role":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#Swift-property-wrappers":{"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#Swift-property-wrappers","kind":"section","abstract":[{"type":"text","text":"Displaying information to the user and modifying data in response to user interactions are essential functions of most apps."},{"text":" ","type":"text"},{"text":"In this article, you’ll learn how to use ","type":"text"},{"code":"@State","type":"codeVoice"},{"text":" and ","type":"text"},{"code":"@Binding","type":"codeVoice"},{"text":" to ensure that your user interface reflects the current state of your app’s data.","type":"text"}],"url":"/tutorials/app-dev-training/managing-data-flow-between-views#Swift-property-wrappers","type":"section","title":"Swift property wrappers"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#Source-of-truth":{"kind":"section","url":"/tutorials/app-dev-training/managing-data-flow-between-views#Source-of-truth","type":"section","abstract":[{"type":"text","text":"Displaying information to the user and modifying data in response to user interactions are essential functions of most apps."},{"type":"text","text":" "},{"text":"In this article, you’ll learn how to use ","type":"text"},{"type":"codeVoice","code":"@State"},{"type":"text","text":" and "},{"code":"@Binding","type":"codeVoice"},{"text":" to ensure that your user interface reflects the current state of your app’s data.","type":"text"}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#Source-of-truth","title":"Source of truth"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Researching-design":{"url":"/tutorials/app-dev-training/growing-your-knowledge#Researching-design","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Researching-design","abstract":[{"type":"text","text":"You’ve completed this module and studied a macOS sample app."},{"type":"text","text":" "},{"type":"text","text":"Review what you’ve learned, and get ideas about where to go from here."}],"kind":"section","title":"Researching design","role":"pseudoSymbol","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#About-this-module":{"kind":"section","role":"pseudoSymbol","type":"section","abstract":[{"type":"text","text":"Learn the essentials of iOS app development by building a fully functional app using SwiftUI."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#About-this-module","url":"/tutorials/app-dev-training/getting-started-with-scrumdinger#About-this-module","title":"About this module"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/Next-steps/Tests":{"role":"article","type":"topic","url":"/tutorials/app-dev-training/next-steps/tests","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/Next-steps/Tests","title":"Tests","abstract":[],"kind":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data#Integrate-SwiftData-models-with-SwiftUI-views":{"kind":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data#Integrate-SwiftData-models-with-SwiftUI-views","url":"/tutorials/app-dev-training/persisting-data#Integrate-SwiftData-models-with-SwiftUI-views","title":"Integrate SwiftData models with SwiftUI views","type":"section","abstract":[{"type":"text","text":"Users can now create and edit scrums, and SwiftUI automatically keeps the app’s user interface up to date."},{"text":" ","type":"text"},{"text":"However, quitting and relaunching Scrumdinger resets all data back to its initial state.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Implementing-content-views":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Implementing-content-views","abstract":[{"type":"text","text":"Content views let you focus on information that you want to display in a view, without worrying about when to update or how to style a view."},{"type":"text","text":" "},{"type":"text","text":"They work with content configurations to keep your app’s information and user interface in sync."}],"role":"pseudoSymbol","kind":"section","type":"section","title":"Implementing content views","url":"/tutorials/app-dev-training/managing-content-views#Implementing-content-views"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data#Refactor-structures-into-SwiftData-model-classes":{"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data#Refactor-structures-into-SwiftData-model-classes","kind":"section","role":"pseudoSymbol","abstract":[{"type":"text","text":"Users can now create and edit scrums, and SwiftUI automatically keeps the app’s user interface up to date."},{"text":" ","type":"text"},{"type":"text","text":"However, quitting and relaunching Scrumdinger resets all data back to its initial state."}],"title":"Refactor structures into SwiftData model classes","url":"/tutorials/app-dev-training/persisting-data#Refactor-structures-into-SwiftData-model-classes"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data#Fetch-multiple-locations":{"title":"Fetch multiple locations","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/caching-network-data#Fetch-multiple-locations","role":"pseudoSymbol","kind":"section","type":"section","abstract":[{"type":"text","text":"Your quake client fetches a list of earthquakes from the network."},{"type":"text","text":" "},{"type":"text","text":"Now, you’ll extend the client to fetch location details for each earthquake."},{"type":"text","text":" "},{"type":"text","text":"Each earthquake requires one additional fetch to retrieve the location information."},{"type":"text","text":" "},{"text":"You’ll make multiple network connections concurrently while maintaining a cache of replies.","type":"text"}],"url":"/tutorials/app-dev-training/caching-network-data#Fetch-multiple-locations"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Decode-a-location":{"title":"Decode a location","url":"/tutorials/app-dev-training/decoding-structured-json#Decode-a-location","kind":"section","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Decode-a-location","abstract":[{"type":"text","text":"In this tutorial, you’ll use Swift APIs to decode earthquake information that the USGS provides."},{"text":" ","type":"text"},{"type":"text","text":"The USGS encodes the earthquake observations in JSON format, which is a popular choice for providing data on the web."},{"type":"text","text":" "},{"type":"text","text":"You’ll access child objects within a JSON hierarchy and ignore fields your app doesn’t need."}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger":{"abstract":[{"text":"Scrumdinger includes two model objects in the starter projects: ","type":"text"},{"code":"ScrumTimer","type":"codeVoice"},{"text":" and ","type":"text"},{"type":"codeVoice","code":"SpeechRecognizer"},{"text":".","type":"text"},{"type":"text","text":" "},{"type":"text","text":"These objects manage dynamic data that display in the Scrumdinger interface."}],"kind":"article","title":"Examining data flow in Scrumdinger","url":"/tutorials/app-dev-training/examining-data-flow-in-scrumdinger","role":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-data-flow-in-scrumdinger","type":"topic","estimatedTime":"5min"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Visually-organize-your-app":{"title":"Visually organize your app","type":"section","url":"/tutorials/app-dev-training/exploring-app-design#Visually-organize-your-app","abstract":[{"text":"Explore aspects of the app’s user experience and visual design.","type":"text"},{"text":" ","type":"text"},{"text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way.","type":"text"},{"text":" ","type":"text"},{"text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app.","type":"text"}],"kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Visually-organize-your-app","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Whats-next":{"role":"pseudoSymbol","abstract":[{"type":"text","text":"The AppKit framework provides a powerful and extensive API for building graphical interfaces for macOS apps."},{"type":"text","text":" "},{"type":"text","text":"Using AppKit, you’ll create amazing apps that tap into the full power of macOS."}],"url":"/tutorials/app-dev-training/integrating-appkit#Whats-next","type":"section","kind":"section","title":"What’s next?","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Whats-next"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Modify-and-style-views":{"url":"/tutorials/app-dev-training/using-stacks-to-arrange-views#Modify-and-style-views","abstract":[{"text":"Create, modify, and combine views to compose your app’s user interface using the SwiftUI declarative syntax.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"You’ll start building Scrumdinger, an app that manages meetings, by arranging groups of views to create the meeting timer screen."},{"text":" ","type":"text"},{"text":"As you progress through the module, you’ll revisit the timer screen as you work toward the final design.","type":"text"}],"title":"Modify and style views","kind":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Modify-and-style-views","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Create-a-reminder-model":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Create-a-reminder-model","abstract":[{"type":"text","text":"In this tutorial, you’ll create your app’s root view, a collection view with a list layout that displays the user’s daily reminders."}],"url":"/tutorials/app-dev-training/creating-a-list-view#Create-a-reminder-model","title":"Create a reminder model","type":"section","role":"pseudoSymbol","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Limiting-tip-frequency":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Limiting-tip-frequency","role":"pseudoSymbol","url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Limiting-tip-frequency","abstract":[{"type":"text","text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app."},{"type":"text","text":" "},{"type":"text","text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app."}],"kind":"section","title":"Limiting tip frequency","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Stylize-the-card":{"kind":"section","type":"section","abstract":[{"type":"text","text":"Scrumdinger keeps a list of daily scrums that the user attends, and it displays that list in its root view."}],"url":"/tutorials/app-dev-training/creating-a-card-view#Stylize-the-card","title":"Stylize the card","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Stylize-the-card"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details":{"url":"/tutorials/app-dev-training/displaying-reminder-details","type":"topic","title":"Displaying reminder details","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details","abstract":[{"type":"text","text":"Every reminder has properties that make it unique."},{"text":" ","type":"text"},{"type":"text","text":"In this tutorial, you’ll create a detail view controller that displays the details of a reminder in a list collection view."}],"estimatedTime":"25min","kind":"project","role":"project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#App-architecture":{"url":"/tutorials/app-dev-training/managing-data-flow-between-views#App-architecture","role":"pseudoSymbol","kind":"section","abstract":[{"text":"Displaying information to the user and modifying data in response to user interactions are essential functions of most apps.","type":"text"},{"text":" ","type":"text"},{"text":"In this article, you’ll learn how to use ","type":"text"},{"type":"codeVoice","code":"@State"},{"text":" and ","type":"text"},{"code":"@Binding","type":"codeVoice"},{"text":" to ensure that your user interface reflects the current state of your app’s data.","type":"text"}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-data-flow-between-views#App-architecture","title":"App architecture"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Sizing-and-positioning-windows":{"type":"section","title":"Sizing and positioning windows","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Sizing-and-positioning-windows","role":"pseudoSymbol","url":"/tutorials/app-dev-training/supporting-multiple-windows#Sizing-and-positioning-windows","kind":"section","abstract":[{"type":"text","text":"Mac users expect to use multiple windows to multitask, quickly switch between frequently used features of an app, or work with multiple pieces of an app’s content at the same time."},{"type":"text","text":" "},{"type":"text","text":"A window can contain a title, toolbar, menu commands, and keyboard shortcuts to help users work efficiently."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings":{"type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings","kind":"project","estimatedTime":"30min","role":"project","url":"/tutorials/app-dev-training/passing-data-with-bindings","title":"Passing data with bindings","abstract":[{"type":"text","text":"In the previous tutorial, you used bindings to share data between the edit view and individual UI controls within that view."},{"type":"text","text":" "},{"type":"text","text":"Now, you’ll expand the editing capabilities by building a color theme picker using bindings that allow the theme picker and edit views to share their data."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Add-a-working-reminder":{"kind":"section","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Add-a-working-reminder","abstract":[{"type":"text","text":"In this tutorial, you’ll add an editing mode to Today that lets users edit the details of a reminder."}],"url":"/tutorials/app-dev-training/editing-reminders#Add-a-working-reminder","title":"Add a working reminder","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Working-with-default-commands":{"title":"Working with default commands","kind":"section","url":"/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Working-with-default-commands","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Working-with-default-commands","abstract":[{"type":"text","text":"Menu bars and keyboard shortcuts are ubiquitous to the macOS experience."},{"type":"text","text":" "},{"type":"text","text":"Although users can directly interact with UI elements, macOS apps support alternate workflows by surfacing frequent actions in an app’s menu or with keyboard shortcuts."}],"type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Resetting-tips":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Resetting-tips","abstract":[{"text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app.","type":"text"}],"url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Resetting-tips","kind":"section","type":"section","title":"Resetting tips","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Creating-command-menus":{"abstract":[{"type":"text","text":"Menu bars and keyboard shortcuts are ubiquitous to the macOS experience."},{"type":"text","text":" "},{"type":"text","text":"Although users can directly interact with UI elements, macOS apps support alternate workflows by surfacing frequent actions in an app’s menu or with keyboard shortcuts."}],"title":"Creating command menus","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Creating-command-menus","role":"pseudoSymbol","type":"section","kind":"section","url":"/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Creating-command-menus"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Using-coordinators":{"url":"/tutorials/app-dev-training/integrating-appkit#Using-coordinators","kind":"section","role":"pseudoSymbol","title":"Using coordinators","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Using-coordinators","type":"section","abstract":[{"text":"The AppKit framework provides a powerful and extensive API for building graphical interfaces for macOS apps.","type":"text"},{"text":" ","type":"text"},{"text":"Using AppKit, you’ll create amazing apps that tap into the full power of macOS.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Customize-the-label-style":{"url":"/tutorials/app-dev-training/creating-a-card-view#Customize-the-label-style","title":"Customize the label style","abstract":[{"text":"Scrumdinger keeps a list of daily scrums that the user attends, and it displays that list in its root view.","type":"text"}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Customize-the-label-style","kind":"section","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Making-a-class-observable":{"abstract":[{"type":"text","text":"You’ve used the "},{"code":"@State","type":"codeVoice"},{"text":" and ","type":"text"},{"type":"codeVoice","code":"@Binding"},{"type":"text","text":" property wrappers to define a value type as a source of truth for triggering updates in your view hierarchy."},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll learn how to define a reference type as a source of truth for your app’s user interface."}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Making-a-class-observable","title":"Making a class observable","url":"/tutorials/app-dev-training/making-classes-observable#Making-a-class-observable","kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Connecting-with-others":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Connecting-with-others","url":"/tutorials/app-dev-training/refining-your-craft#Connecting-with-others","role":"pseudoSymbol","type":"section","kind":"section","title":"Connecting with others","abstract":[{"text":"You’ve taken the next steps as a developer. Review what you’ve learned, and get ideas about where to go from here.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Tour-of-the-app":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Tour-of-the-app","url":"/tutorials/app-dev-training/getting-started-with-earthquakes#Tour-of-the-app","role":"pseudoSymbol","type":"section","title":"Tour of the app","abstract":[{"text":"Take the next steps in app development, and build an app to download, decode, and present data from a network data source.","type":"text"},{"text":" ","type":"text"},{"text":"Use SwiftUI to build a simple interface to display dynamic data from a concurrent network client.","type":"text"}],"kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views","role":"project","url":"/tutorials/app-dev-training/using-content-views","title":"Using content views","abstract":[{"text":"In this tutorial, you’ll add capabilities to the app’s editing mode that transform a view-only list of reminder details into editable controls.","type":"text"}],"estimatedTime":"35min","type":"topic","kind":"project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Extract-configuration-methods":{"url":"/tutorials/app-dev-training/using-content-views#Extract-configuration-methods","role":"pseudoSymbol","abstract":[{"type":"text","text":"In this tutorial, you’ll add capabilities to the app’s editing mode that transform a view-only list of reminder details into editable controls."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Extract-configuration-methods","kind":"section","type":"section","title":"Extract configuration methods"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Persistence-and-error-handling":{"role":"article","abstract":[],"url":"/tutorials/app-dev-training/swiftui/persistence-and-error-handling","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Persistence-and-error-handling","title":"Persistence and error handling","kind":"article","type":"topic"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Create-a-reminder-view":{"abstract":[{"type":"text","text":"Every reminder has properties that make it unique."},{"type":"text","text":" "},{"type":"text","text":"In this tutorial, you’ll create a detail view controller that displays the details of a reminder in a list collection view."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-reminder-details#Create-a-reminder-view","type":"section","url":"/tutorials/app-dev-training/displaying-reminder-details#Create-a-reminder-view","title":"Create a reminder view","role":"pseudoSymbol","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Iterate-through-attendees":{"type":"section","kind":"section","abstract":[{"text":"You’ve learned how to create SwiftUI views, but you need to know how to navigate between them.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"In this tutorial, you’ll create a navigation hierarchy."}],"role":"pseudoSymbol","title":"Iterate through attendees","url":"/tutorials/app-dev-training/creating-a-navigation-hierarchy#Iterate-through-attendees","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Iterate-through-attendees"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Adding-objects":{"role":"pseudoSymbol","type":"section","abstract":[{"text":"In the previous article, you examined how to define your app’s storage schema in its model code.","type":"text"},{"text":" ","type":"text"},{"text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data.","type":"text"}],"kind":"section","title":"Adding objects","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Adding-objects","url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Adding-objects"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Creating-a-context-menu":{"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Creating-a-context-menu","abstract":[{"type":"text","text":"Menu bars and keyboard shortcuts are ubiquitous to the macOS experience."},{"type":"text","text":" "},{"type":"text","text":"Although users can directly interact with UI elements, macOS apps support alternate workflows by surfacing frequent actions in an app’s menu or with keyboard shortcuts."}],"url":"/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Creating-a-context-menu","kind":"section","title":"Creating a context menu","role":"pseudoSymbol"},"SUI000_003.png":{"type":"image","identifier":"SUI000_003.png","alt":"Screenshot of meeting timer screen with three main sections","variants":[{"traits":["1x","light"],"url":"https://docs-assets.developer.apple.com/published/dbca97e824fd54d3de68f9db0cd02a8c/SUI000_003.png"},{"traits":["2x","light"],"url":"https://docs-assets.developer.apple.com/published/b1515f174d5592a8d0569d3788649317/SUI000_003%402x.png"},{"url":"https://docs-assets.developer.apple.com/published/7d76bbed08717263f8fbc83ac552b0d6/SUI000_003~dark.png","traits":["1x","dark"]},{"traits":["2x","dark"],"url":"https://docs-assets.developer.apple.com/published/fad14d0f4fe2e57c747f6d2fbd9b2267/SUI000_003~dark%402x.png"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Update-progress-dynamically":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Update-progress-dynamically","url":"/tutorials/app-dev-training/creating-a-progress-view#Update-progress-dynamically","abstract":[{"type":"text","text":"Create a progress view in Today so that users can track the percentage of reminders they’ve completed."}],"type":"section","kind":"section","title":"Update progress dynamically","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Trigger-sound-with-AVFoundation":{"url":"/tutorials/app-dev-training/managing-state-and-life-cycle#Trigger-sound-with-AVFoundation","kind":"section","abstract":[{"text":"Scrumdinger keeps you informed as your scrum changes.","type":"text"},{"text":" ","type":"text"},{"text":"To build this key feature in the app, you’ll use life cycle methods to control a model that manages the scrum state.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Trigger-sound-with-AVFoundation","title":"Trigger sound with AVFoundation","type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#Scene-architecture":{"url":"/tutorials/app-dev-training/responding-to-events#Scene-architecture","role":"pseudoSymbol","kind":"section","abstract":[{"text":"As you’ve learned so far in this module, you can use SwiftUI property wrappers to manage state in your app’s user interface and respond to user interaction.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"But how do you perform actions in response to changes in app state?"}],"title":"Scene architecture","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/responding-to-events#Scene-architecture"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-existentials-and-generics":{"role":"article","kind":"article","type":"topic","estimatedTime":"5min","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-existentials-and-generics","abstract":[{"text":"Earthquakes will use a network client to fetch JSON data from a remote server.","type":"text"},{"type":"text","text":" "},{"text":"This article introduces generic and existential types that you can use to develop a reusable network client.","type":"text"},{"text":" ","type":"text"},{"text":"It also explores using these types in tests to ensure the client is robust.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll consider how these types affect your code’s simplicity and performance.","type":"text"}],"title":"Using existentials and generics","url":"/tutorials/app-dev-training/using-existentials-and-generics"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Labels-and-traits":{"title":"Labels and traits","url":"/tutorials/app-dev-training/examining-accessibility-in-today#Labels-and-traits","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Labels-and-traits","abstract":[{"type":"text","text":"During the development of Today, you’ve created a custom accessibility action, label, and value."},{"type":"text","text":" "},{"type":"text","text":"However, the app takes advantage of many accessibility features by default."}],"kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view":{"type":"topic","role":"project","title":"Creating a card view","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view","url":"/tutorials/app-dev-training/creating-a-card-view","estimatedTime":"20min","abstract":[{"type":"text","text":"Scrumdinger keeps a list of daily scrums that the user attends, and it displays that list in its root view."}],"kind":"project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Displaying-collections":{"url":"/tutorials/app-dev-training/adopting-collection-views#Displaying-collections","title":"Displaying collections","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Displaying-collections","kind":"section","role":"pseudoSymbol","type":"section","abstract":[{"type":"text","text":"Collection views manage ordered collections of data items and use customizable layouts to present them."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Add-a-theme-picker":{"type":"section","title":"Add a theme picker","abstract":[{"type":"text","text":"In the previous tutorial, you used bindings to share data between the edit view and individual UI controls within that view."},{"type":"text","text":" "},{"type":"text","text":"Now, you’ll expand the editing capabilities by building a color theme picker using bindings that allow the theme picker and edit views to share their data."}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Add-a-theme-picker","kind":"section","url":"/tutorials/app-dev-training/passing-data-with-bindings#Add-a-theme-picker"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Working-with-reference-types":{"title":"Working with reference types","role":"pseudoSymbol","abstract":[{"type":"text","text":"You’ve used the "},{"type":"codeVoice","code":"@State"},{"type":"text","text":" and "},{"type":"codeVoice","code":"@Binding"},{"text":" property wrappers to define a value type as a source of truth for triggering updates in your view hierarchy.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll learn how to define a reference type as a source of truth for your app’s user interface."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Working-with-reference-types","kind":"section","type":"section","url":"/tutorials/app-dev-training/making-classes-observable#Working-with-reference-types"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/UIKit-essentials":{"type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/UIKit-essentials","abstract":[],"role":"article","title":"UIKit essentials","kind":"article","url":"/tutorials/app-dev-training/uikit/uikit-essentials"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#UIKit-overview":{"abstract":[{"type":"text","text":"Learn to develop a fully functional app with the UIKit framework."}],"kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#UIKit-overview","url":"/tutorials/app-dev-training/getting-started-with-today#UIKit-overview","type":"section","title":"UIKit overview","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Navigate-between-screens":{"abstract":[{"type":"text","text":"You’ve learned how to create SwiftUI views, but you need to know how to navigate between them."},{"type":"text","text":" "},{"type":"text","text":"In this tutorial, you’ll create a navigation hierarchy."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Navigate-between-screens","role":"pseudoSymbol","kind":"section","type":"section","title":"Navigate between screens","url":"/tutorials/app-dev-training/creating-a-navigation-hierarchy#Navigate-between-screens"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Ways-to-make-an-app-accessible":{"role":"pseudoSymbol","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Ways-to-make-an-app-accessible","url":"/tutorials/app-dev-training/examining-accessibility-in-today#Ways-to-make-an-app-accessible","title":"Ways to make an app accessible","abstract":[{"text":"During the development of Today, you’ve created a custom accessibility action, label, and value.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"However, the app takes advantage of many accessibility features by default."}],"kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Decode-GeoJSON":{"kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Decode-GeoJSON","url":"/tutorials/app-dev-training/decoding-structured-json#Decode-GeoJSON","role":"pseudoSymbol","title":"Decode GeoJSON","type":"section","abstract":[{"type":"text","text":"In this tutorial, you’ll use Swift APIs to decode earthquake information that the USGS provides."},{"text":" ","type":"text"},{"text":"The USGS encodes the earthquake observations in JSON format, which is a popular choice for providing data on the web.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You’ll access child objects within a JSON hierarchy and ignore fields your app doesn’t need."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Creating-and-updating-your-view":{"kind":"section","abstract":[{"type":"text","text":"The AppKit framework provides a powerful and extensive API for building graphical interfaces for macOS apps."},{"type":"text","text":" "},{"type":"text","text":"Using AppKit, you’ll create amazing apps that tap into the full power of macOS."}],"url":"/tutorials/app-dev-training/integrating-appkit#Creating-and-updating-your-view","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Creating-and-updating-your-view","type":"section","title":"Creating and updating your view","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info":{"title":"Displaying cell info","type":"topic","estimatedTime":"20min","abstract":[{"text":"Today uses a collection view to display a list of reminders in a sequence of cells.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info","role":"project","url":"/tutorials/app-dev-training/displaying-cell-info","kind":"project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Whats-next":{"role":"pseudoSymbol","title":"What’s next","url":"/tutorials/app-dev-training/examining-accessibility-in-today#Whats-next","type":"section","abstract":[{"text":"During the development of Today, you’ve created a custom accessibility action, label, and value.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"However, the app takes advantage of many accessibility features by default."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Whats-next","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design":{"kind":"article","type":"topic","abstract":[{"type":"text","text":"Explore aspects of the app’s user experience and visual design."},{"type":"text","text":" "},{"type":"text","text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way."},{"text":" ","type":"text"},{"type":"text","text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app."}],"role":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design","url":"/tutorials/app-dev-training/exploring-app-design","title":"Exploring app design","estimatedTime":"10min"},"https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures/":{"url":"https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures/","title":"Closures","type":"link","identifier":"https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures/","titleInlineContent":[{"text":"Closures","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Show-headers-in-editing-mode":{"url":"/tutorials/app-dev-training/getting-ready-for-editing#Show-headers-in-editing-mode","abstract":[{"text":"In this tutorial, you’ll begin implementing an editing mode for Today so that users can modify the details of a reminder they’re viewing.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll configure the data source for view and editing modes, and add a button that transitions between the two modes.","type":"text"}],"type":"section","role":"pseudoSymbol","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Show-headers-in-editing-mode","title":"Show headers in editing mode"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view":{"abstract":[{"type":"text","text":"In this tutorial, you’ll create your app’s root view, a collection view with a list layout that displays the user’s daily reminders."}],"url":"/tutorials/app-dev-training/creating-a-list-view","kind":"project","estimatedTime":"30min","type":"topic","title":"Creating a list view","role":"project","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-windows-programmatically":{"type":"section","kind":"section","abstract":[{"type":"text","text":"Mac users expect to use multiple windows to multitask, quickly switch between frequently used features of an app, or work with multiple pieces of an app’s content at the same time."},{"type":"text","text":" "},{"text":"A window can contain a title, toolbar, menu commands, and keyboard shortcuts to help users work efficiently.","type":"text"}],"title":"Opening and dismissing windows programmatically","url":"/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-windows-programmatically","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-windows-programmatically","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Creating-a-diffable-data-source":{"abstract":[{"type":"text","text":"Collection views manage ordered collections of data items and use customizable layouts to present them."}],"kind":"section","title":"Creating a diffable data source","url":"/tutorials/app-dev-training/adopting-collection-views#Creating-a-diffable-data-source","role":"pseudoSymbol","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Creating-a-diffable-data-source"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json":{"role":"project","url":"/tutorials/app-dev-training/decoding-structured-json","type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json","title":"Decoding structured JSON","abstract":[{"type":"text","text":"In this tutorial, you’ll use Swift APIs to decode earthquake information that the USGS provides."},{"type":"text","text":" "},{"text":"The USGS encodes the earthquake observations in JSON format, which is a popular choice for providing data on the web.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"You’ll access child objects within a JSON hierarchy and ignore fields your app doesn’t need."}],"estimatedTime":"30min","kind":"project"},"SUI010-cta.png":{"identifier":"SUI010-cta.png","type":"image","alt":" ","variants":[{"traits":["1x","light"],"url":"https://docs-assets.developer.apple.com/published/298084e22891cbe383331aeb3689a202/SUI010-cta.png"},{"url":"https://docs-assets.developer.apple.com/published/e21c36f276005a53964444d8c4ce6d61/SUI010-cta%402x.png","traits":["2x","light"]}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/updating-app-data#Use-the-edit-view-to-create-a-new-scrum":{"type":"section","kind":"section","abstract":[{"text":"In this tutorial, you’ll add two new features to Scrumdinger.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"First, you’ll add a view to create new daily scrum meetings."},{"type":"text","text":" "},{"text":"Then, you’ll update the meeting timer to keep track of past meetings.","type":"text"}],"url":"/tutorials/app-dev-training/updating-app-data#Use-the-edit-view-to-create-a-new-scrum","title":"Use the edit view to create a new scrum","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/updating-app-data#Use-the-edit-view-to-create-a-new-scrum","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Report-errors":{"abstract":[{"text":"During the development of your app, you may have encountered and fixed syntax or semantic errors.","type":"text"},{"text":" ","type":"text"},{"text":"But unexpected issues that are out of your control can still happen.","type":"text"},{"text":" ","type":"text"},{"text":"Network connections can break.","type":"text"},{"text":" ","type":"text"},{"text":"Reading data from a file can fail in several ways.","type":"text"}],"title":"Report errors","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Report-errors","type":"section","url":"/tutorials/app-dev-training/handling-errors#Report-errors","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Extract-the-meeting-header":{"url":"/tutorials/app-dev-training/managing-state-and-life-cycle#Extract-the-meeting-header","kind":"section","abstract":[{"text":"Scrumdinger keeps you informed as your scrum changes.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"To build this key feature in the app, you’ll use life cycle methods to control a model that manages the scrum state."}],"role":"pseudoSymbol","type":"section","title":"Extract the meeting header","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Extract-the-meeting-header"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Adding-menu-bar-commands":{"kind":"section","title":"Adding menu bar commands","abstract":[{"type":"text","text":"Menu bars and keyboard shortcuts are ubiquitous to the macOS experience."},{"type":"text","text":" "},{"text":"Although users can directly interact with UI elements, macOS apps support alternate workflows by surfacing frequent actions in an app’s menu or with keyboard shortcuts.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Adding-menu-bar-commands","url":"/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts#Adding-menu-bar-commands","role":"pseudoSymbol","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Observe-changes-in-a-view-hierarchy":{"role":"pseudoSymbol","abstract":[{"text":"In this tutorial, you’ll add an editing mode to Today that lets users edit the details of a reminder.","type":"text"}],"url":"/tutorials/app-dev-training/editing-reminders#Observe-changes-in-a-view-hierarchy","kind":"section","title":"Observe changes in a view hierarchy","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Observe-changes-in-a-view-hierarchy","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle":{"title":"Managing state and life cycle","type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle","abstract":[{"text":"Scrumdinger keeps you informed as your scrum changes.","type":"text"},{"text":" ","type":"text"},{"text":"To build this key feature in the app, you’ll use life cycle methods to control a model that manages the scrum state.","type":"text"}],"url":"/tutorials/app-dev-training/managing-state-and-life-cycle","kind":"project","estimatedTime":"30min","role":"project"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Time-to-begin":{"abstract":[{"text":"Take the next steps in app development, and build an app to download, decode, and present data from a network data source.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Use SwiftUI to build a simple interface to display dynamic data from a concurrent network client."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Time-to-begin","title":"Time to begin","url":"/tutorials/app-dev-training/getting-started-with-earthquakes#Time-to-begin","type":"section","role":"pseudoSymbol","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Continuing-your-training":{"abstract":[{"type":"text","text":"You completed this introduction to UIKit and built a complete app that integrates with Reminders."},{"type":"text","text":" "},{"text":"Review what you’ve learned and get ideas about where to go from here.","type":"text"}],"title":"Continuing your training","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Continuing-your-training","role":"pseudoSymbol","kind":"section","type":"section","url":"/tutorials/app-dev-training/continuing-your-learning#Continuing-your-training"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Add-an-error-wrapper-structure":{"abstract":[{"text":"During the development of your app, you may have encountered and fixed syntax or semantic errors.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"But unexpected issues that are out of your control can still happen."},{"type":"text","text":" "},{"type":"text","text":"Network connections can break."},{"type":"text","text":" "},{"type":"text","text":"Reading data from a file can fail in several ways."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Add-an-error-wrapper-structure","title":"Add an error wrapper structure","role":"pseudoSymbol","kind":"section","url":"/tutorials/app-dev-training/handling-errors#Add-an-error-wrapper-structure","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Whats-next":{"title":"What’s next?","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Whats-next","abstract":[{"type":"text","text":"You completed this module on SwiftUI and built your first app. Review what you’ve learned, and get ideas about where to go from here."}],"type":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/finding-more-resources#Whats-next"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Add-an-edit-view-for-scrum-details":{"role":"pseudoSymbol","abstract":[{"type":"text","text":"In this tutorial, you’ll create a new view containing controls to edit a scrum."},{"text":" ","type":"text"},{"type":"text","text":"SwiftUI provides all the standard controls for iOS apps."},{"type":"text","text":" "},{"text":"You’ll add buttons, a slider, and a text field.","type":"text"},{"text":" ","type":"text"},{"text":"Then, you’ll update the detail view to present your new edit view.","type":"text"}],"title":"Add an edit view for scrum details","url":"/tutorials/app-dev-training/creating-the-edit-view#Add-an-edit-view-for-scrum-details","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Add-an-edit-view-for-scrum-details","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation#Defining-a-sidebar-interface":{"type":"section","role":"pseudoSymbol","title":"Defining a sidebar interface","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation#Defining-a-sidebar-interface","abstract":[{"text":"An intuitive navigation structure helps organize your app’s user interface so that users can easily find the content they’re looking for.","type":"text"},{"type":"text","text":" "},{"text":"In this article, you’ll explore how Article Accelerator uses a multicolumn container to guide users through a hierarchy of information.","type":"text"}],"url":"/tutorials/app-dev-training/displaying-multi-column-navigation#Defining-a-sidebar-interface","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Whats-next":{"abstract":[{"type":"text","text":"You completed this introduction to UIKit and built a complete app that integrates with Reminders."},{"type":"text","text":" "},{"text":"Review what you’ve learned and get ideas about where to go from here.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Whats-next","url":"/tutorials/app-dev-training/continuing-your-learning#Whats-next","kind":"section","type":"section","role":"pseudoSymbol","title":"What’s next?"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data":{"title":"Persisting data","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/persisting-data","role":"project","type":"topic","url":"/tutorials/app-dev-training/persisting-data","abstract":[{"type":"text","text":"Users can now create and edit scrums, and SwiftUI automatically keeps the app’s user interface up to date."},{"type":"text","text":" "},{"type":"text","text":"However, quitting and relaunching Scrumdinger resets all data back to its initial state."}],"kind":"project","estimatedTime":"20min"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Connecting-with-others":{"title":"Connecting with others","url":"/tutorials/app-dev-training/growing-your-knowledge#Connecting-with-others","type":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Connecting-with-others","abstract":[{"type":"text","text":"You’ve completed this module and studied a macOS sample app."},{"type":"text","text":" "},{"type":"text","text":"Review what you’ve learned, and get ideas about where to go from here."}],"kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Create-sections-for-an-editing-mode":{"url":"/tutorials/app-dev-training/getting-ready-for-editing#Create-sections-for-an-editing-mode","title":"Create sections for an editing mode","kind":"section","abstract":[{"text":"In this tutorial, you’ll begin implementing an editing mode for Today so that users can modify the details of a reminder they’re viewing.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll configure the data source for view and editing modes, and add a button that transitions between the two modes.","type":"text"}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing#Create-sections-for-an-editing-mode","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#What-youve-learned":{"url":"/tutorials/app-dev-training/growing-your-knowledge#What-youve-learned","kind":"section","title":"What you’ve learned","abstract":[{"text":"You’ve completed this module and studied a macOS sample app.","type":"text"},{"text":" ","type":"text"},{"text":"Review what you’ve learned, and get ideas about where to go from here.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#What-youve-learned","type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Technology-overview":{"role":"pseudoSymbol","kind":"section","url":"/tutorials/app-dev-training/getting-started-with-earthquakes#Technology-overview","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#Technology-overview","title":"Technology overview","type":"section","abstract":[{"type":"text","text":"Take the next steps in app development, and build an app to download, decode, and present data from a network data source."},{"type":"text","text":" "},{"type":"text","text":"Use SwiftUI to build a simple interface to display dynamic data from a concurrent network client."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Using-dynamic-queries":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Using-dynamic-queries","title":"Using dynamic queries","url":"/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Using-dynamic-queries","abstract":[{"type":"text","text":"Previously, you learned how to create a SwiftData model context and add objects to it."},{"text":" ","type":"text"},{"type":"text","text":"In this article, you’ll learn how Article Accelerator fetches objects from a persistent store."},{"type":"text","text":" "},{"type":"text","text":"And you’ll explore how to sort and filter the objects to list only the objects that you want."}],"kind":"section","type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Filter-reminders-by-list-style":{"abstract":[{"type":"text","text":"For users to more easily access their reminders on the Today app’s main view, you’ll create a "},{"code":"ListStyle","type":"codeVoice"},{"type":"text","text":" enumeration that separates reminders into three categories: Today, Future, and All."},{"type":"text","text":" "},{"type":"text","text":"You’ll also add a segmented control that lets users select different styles for the reminders list."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Filter-reminders-by-list-style","url":"/tutorials/app-dev-training/filtering-reminders#Filter-reminders-by-list-style","kind":"section","type":"section","role":"pseudoSymbol","title":"Filter reminders by list style"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Building-apps-for-other-platforms":{"abstract":[{"text":"You’ve taken the next steps as a developer. Review what you’ve learned, and get ideas about where to go from here.","type":"text"}],"kind":"section","title":"Building apps for other platforms","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Building-apps-for-other-platforms","type":"section","url":"/tutorials/app-dev-training/refining-your-craft#Building-apps-for-other-platforms"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Whats-next":{"url":"/tutorials/app-dev-training/supporting-drag-and-drop#Whats-next","role":"pseudoSymbol","abstract":[{"type":"text","text":"On macOS, users can drag an item from one place in an app to another location."},{"text":" ","type":"text"},{"text":"With these drag-and-drop operations, users can perform actions like moving or copying an item.","type":"text"}],"type":"section","title":"What’s next?","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop#Whats-next"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Creating-more-apps":{"abstract":[{"type":"text","text":"You completed this introduction to UIKit and built a complete app that integrates with Reminders."},{"type":"text","text":" "},{"type":"text","text":"Review what you’ve learned and get ideas about where to go from here."}],"kind":"section","url":"/tutorials/app-dev-training/continuing-your-learning#Creating-more-apps","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning#Creating-more-apps","role":"pseudoSymbol","type":"section","title":"Creating more apps"},"https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/":{"titleInlineContent":[{"text":"The Basics","type":"text"}],"type":"link","url":"https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/","title":"The Basics","identifier":"https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-gradient-background#Create-a-gradient-layer":{"url":"/tutorials/app-dev-training/creating-a-gradient-background#Create-a-gradient-layer","role":"pseudoSymbol","abstract":[{"text":"Color is an important aspect of app design and can help establish visual consistency, communicate functionality, and align with brand identity.","type":"text"}],"title":"Create a gradient layer","type":"section","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-gradient-background#Create-a-gradient-layer"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Preview-using-Accessibility-Inspector":{"abstract":[{"text":"A ","type":"text"},{"inlineContent":[{"text":"diffable data source","type":"text"}],"type":"emphasis"},{"text":" stores a list of identifiers that represents the identities of the items in the collection view.","type":"text"},{"text":" ","type":"text"},{"text":"In this tutorial, you’ll make the reminder model ","type":"text"},{"inlineContent":[{"type":"text","text":"identifiable"}],"type":"emphasis"},{"text":" so that you can uniquely identify each reminder.","type":"text"}],"title":"Preview using Accessibility Inspector","url":"/tutorials/app-dev-training/making-reminders-identifiable#Preview-using-Accessibility-Inspector","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Preview-using-Accessibility-Inspector","role":"pseudoSymbol","type":"section","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Putting-it-all-together":{"title":"Putting it all together","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-classes-observable#Putting-it-all-together","type":"section","url":"/tutorials/app-dev-training/making-classes-observable#Putting-it-all-together","kind":"section","abstract":[{"text":"You’ve used the ","type":"text"},{"code":"@State","type":"codeVoice"},{"text":" and ","type":"text"},{"code":"@Binding","type":"codeVoice"},{"text":" property wrappers to define a value type as a source of truth for triggering updates in your view hierarchy.","type":"text"},{"text":" ","type":"text"},{"text":"In this article, you’ll learn how to define a reference type as a source of truth for your app’s user interface.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-unique-windows":{"url":"/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-unique-windows","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Opening-and-dismissing-unique-windows","role":"pseudoSymbol","type":"section","abstract":[{"type":"text","text":"Mac users expect to use multiple windows to multitask, quickly switch between frequently used features of an app, or work with multiple pieces of an app’s content at the same time."},{"type":"text","text":" "},{"text":"A window can contain a title, toolbar, menu commands, and keyboard shortcuts to help users work efficiently.","type":"text"}],"title":"Opening and dismissing unique windows","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Update-the-snapshot":{"url":"/tutorials/app-dev-training/making-reminders-identifiable#Update-the-snapshot","kind":"section","title":"Update the snapshot","abstract":[{"text":"A ","type":"text"},{"inlineContent":[{"type":"text","text":"diffable data source"}],"type":"emphasis"},{"text":" stores a list of identifiers that represents the identities of the items in the collection view.","type":"text"},{"text":" ","type":"text"},{"text":"In this tutorial, you’ll make the reminder model ","type":"text"},{"type":"emphasis","inlineContent":[{"text":"identifiable","type":"text"}]},{"type":"text","text":" so that you can uniquely identify each reminder."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Update-the-snapshot","type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Save-added-reminders":{"url":"/tutorials/app-dev-training/saving-reminders#Save-added-reminders","title":"Save added reminders","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Save-added-reminders","role":"pseudoSymbol","kind":"section","type":"section","abstract":[{"text":"You still have some important features to add to your app.","type":"text"},{"type":"text","text":" "},{"text":"When Today closes, it loses changes that the user made within the app.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"And it doesn’t automatically reflect changes the user makes outside of the app."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Choosing-a-location-for-app-settings":{"kind":"section","url":"/tutorials/app-dev-training/displaying-app-settings#Choosing-a-location-for-app-settings","abstract":[{"text":"macOS apps often offer users a way to customize their experience.","type":"text"},{"text":" ","type":"text"},{"text":"Learn about the different areas where you can surface app settings.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Examine how Article Accelerator creates an app-specific settings window."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Choosing-a-location-for-app-settings","role":"pseudoSymbol","type":"section","title":"Choosing a location for app settings"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#Article":{"kind":"section","type":"section","abstract":[{"type":"text","text":"Article Accelerator acts on a mixture of immutable data that a service provides and mutable data that a user creates."},{"type":"text","text":" "},{"type":"text","text":"You’ll investigate the app’s structure and learn how data flows in and through the app."},{"text":" ","type":"text"},{"text":"You’ll also learn how Article Accelerator organizes that data into various types.","type":"text"}],"url":"/tutorials/app-dev-training/dissecting-an-apps-architecture#Article","title":"Article","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#Article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Using-custom-content-views-in-Today":{"kind":"section","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Using-custom-content-views-in-Today","abstract":[{"text":"Content views let you focus on information that you want to display in a view, without worrying about when to update or how to style a view.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"They work with content configurations to keep your app’s information and user interface in sync."}],"url":"/tutorials/app-dev-training/managing-content-views#Using-custom-content-views-in-Today","title":"Using custom content views in Today","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Whats-next":{"url":"/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Whats-next","title":"What’s next?","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Whats-next","type":"section","kind":"section","abstract":[{"type":"text","text":"Previously, you learned how to create a SwiftData model context and add objects to it."},{"text":" ","type":"text"},{"type":"text","text":"In this article, you’ll learn how Article Accelerator fetches objects from a persistent store."},{"type":"text","text":" "},{"type":"text","text":"And you’ll explore how to sort and filter the objects to list only the objects that you want."}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Tour-of-the-app":{"url":"/tutorials/app-dev-training/getting-started-with-article-accelerator#Tour-of-the-app","abstract":[{"text":"Explore SwiftUI sample code to learn how to build a desktop-class macOS app.","type":"text"},{"text":" ","type":"text"},{"text":"Learn about the development and design principles that make an app feel at home on Mac.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Tour-of-the-app","type":"section","title":"Tour of the app","kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Test-EventKit-integration":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Test-EventKit-integration","url":"/tutorials/app-dev-training/loading-reminders#Test-EventKit-integration","abstract":[{"text":"With the EventKit framework, you can request access to a user’s calendar events and reminders.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You can use EventKit to share data between the Reminders and Today apps."}],"role":"pseudoSymbol","kind":"section","type":"section","title":"Test EventKit integration"},"SUI000_hero.png":{"identifier":"SUI000_hero.png","alt":" ","variants":[{"url":"https://docs-assets.developer.apple.com/published/bd76d8d5a3f88118ceb5b3148f7b9b48/SUI000_hero.png","traits":["1x","light"]},{"traits":["2x","light"],"url":"https://docs-assets.developer.apple.com/published/dc1dc423bbf9679c2f5c47e6317647ce/SUI000_hero%402x.png"}],"type":"image"},"https://apps.apple.com/us/app/xcode/id497799835?mt=12":{"url":"https://apps.apple.com/us/app/xcode/id497799835?mt=12","type":"link","title":"latest version of Xcode","titleInlineContent":[{"type":"text","text":"latest version of Xcode"}],"identifier":"https://apps.apple.com/us/app/xcode/id497799835?mt=12"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Create-a-project":{"title":"Create a project","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-stacks-to-arrange-views#Create-a-project","kind":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/using-stacks-to-arrange-views#Create-a-project","type":"section","abstract":[{"text":"Create, modify, and combine views to compose your app’s user interface using the SwiftUI declarative syntax.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You’ll start building Scrumdinger, an app that manages meetings, by arranging groups of views to create the meeting timer screen."},{"type":"text","text":" "},{"text":"As you progress through the module, you’ll revisit the timer screen as you work toward the final design.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Display-a-history-view":{"title":"Display a history view","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Display-a-history-view","role":"pseudoSymbol","type":"section","abstract":[{"text":"In this tutorial, you’ll add a feature to Scrumdinger that captures and logs meeting transcripts.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"You’ll request access to device hardware like the microphone and integrate the Speech framework to transcribe live audio to text."}],"kind":"section","url":"/tutorials/app-dev-training/transcribing-speech-to-text#Display-a-history-view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Whats-next":{"type":"section","url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Whats-next","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Whats-next","abstract":[{"text":"In the previous article, you examined how to define your app’s storage schema in its model code.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data."}],"kind":"section","title":"What’s next?","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today":{"role":"article","abstract":[{"type":"text","text":"During the development of Today, you’ve created a custom accessibility action, label, and value."},{"type":"text","text":" "},{"type":"text","text":"However, the app takes advantage of many accessibility features by default."}],"kind":"article","estimatedTime":"10min","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today","url":"/tutorials/app-dev-training/examining-accessibility-in-today","type":"topic","title":"Examining accessibility in Today"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-existentials-and-generics#Using-existential-types-in-Earthquakes":{"type":"section","kind":"section","abstract":[{"text":"Earthquakes will use a network client to fetch JSON data from a remote server.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"This article introduces generic and existential types that you can use to develop a reusable network client."},{"type":"text","text":" "},{"text":"It also explores using these types in tests to ensure the client is robust.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll consider how these types affect your code’s simplicity and performance.","type":"text"}],"role":"pseudoSymbol","url":"/tutorials/app-dev-training/using-existentials-and-generics#Using-existential-types-in-Earthquakes","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-existentials-and-generics#Using-existential-types-in-Earthquakes","title":"Using existential types in Earthquakes"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Add-action-to-segmented-control":{"abstract":[{"text":"For users to more easily access their reminders on the Today app’s main view, you’ll create a ","type":"text"},{"type":"codeVoice","code":"ListStyle"},{"type":"text","text":" enumeration that separates reminders into three categories: Today, Future, and All."},{"text":" ","type":"text"},{"type":"text","text":"You’ll also add a segmented control that lets users select different styles for the reminders list."}],"kind":"section","title":"Add action to segmented control","url":"/tutorials/app-dev-training/filtering-reminders#Add-action-to-segmented-control","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Add-action-to-segmented-control","type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Creating-a-model-container":{"kind":"section","url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Creating-a-model-container","title":"Creating a model container","abstract":[{"text":"In the previous article, you examined how to define your app’s storage schema in its model code.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data."}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Creating-a-model-container","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Configure-the-data-source":{"abstract":[{"type":"text","text":"In this tutorial, you’ll create your app’s root view, a collection view with a list layout that displays the user’s daily reminders."}],"title":"Configure the data source","role":"pseudoSymbol","url":"/tutorials/app-dev-training/creating-a-list-view#Configure-the-data-source","type":"section","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-list-view#Configure-the-data-source"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/navigating-the-sample-project#Explore-Article-Accelerator":{"abstract":[{"text":"Welcome to the Article Accelerator app.","type":"text"},{"type":"text","text":" "},{"text":"In this tutorial, you’ll explore how the project is organized, run the completed app, and test some user flows.","type":"text"}],"url":"/tutorials/app-dev-training/navigating-the-sample-project#Explore-Article-Accelerator","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/navigating-the-sample-project#Explore-Article-Accelerator","kind":"section","role":"pseudoSymbol","title":"Explore Article Accelerator"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#Models":{"title":"Models","kind":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/dissecting-an-apps-architecture#Models","type":"section","abstract":[{"text":"Article Accelerator acts on a mixture of immutable data that a service provides and mutable data that a user creates.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You’ll investigate the app’s structure and learn how data flows in and through the app."},{"text":" ","type":"text"},{"text":"You’ll also learn how Article Accelerator organizes that data into various types.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/dissecting-an-apps-architecture#Models"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Creating-tips":{"url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Creating-tips","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Creating-tips","title":"Creating tips","kind":"section","abstract":[{"text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app.","type":"text"}],"type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Adding-elements-to-a-relationship":{"title":"Adding elements to a relationship","kind":"section","url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Adding-elements-to-a-relationship","type":"section","abstract":[{"type":"text","text":"In the previous article, you examined how to define your app’s storage schema in its model code."},{"type":"text","text":" "},{"type":"text","text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Adding-elements-to-a-relationship","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Custom-accessibility-elements":{"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/examining-accessibility-in-today#Custom-accessibility-elements","url":"/tutorials/app-dev-training/examining-accessibility-in-today#Custom-accessibility-elements","abstract":[{"text":"During the development of Today, you’ve created a custom accessibility action, label, and value.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"However, the app takes advantage of many accessibility features by default."}],"type":"section","title":"Custom accessibility elements","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts":{"title":"Customizing menus","estimatedTime":"15min","role":"article","url":"/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts","kind":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/customizing-menus-with-commands-and-shortcuts","abstract":[{"text":"Menu bars and keyboard shortcuts are ubiquitous to the macOS experience.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Although users can directly interact with UI elements, macOS apps support alternate workflows by surfacing frequent actions in an app’s menu or with keyboard shortcuts."}],"type":"topic"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit":{"kind":"article","abstract":[{"type":"text","text":"The AppKit framework provides a powerful and extensive API for building graphical interfaces for macOS apps."},{"text":" ","type":"text"},{"type":"text","text":"Using AppKit, you’ll create amazing apps that tap into the full power of macOS."}],"title":"Integrating AppKit","url":"/tutorials/app-dev-training/integrating-appkit","type":"topic","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit","estimatedTime":"15min","role":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Convert-between-model-types":{"abstract":[{"type":"text","text":"You still have some important features to add to your app."},{"type":"text","text":" "},{"type":"text","text":"When Today closes, it loses changes that the user made within the app."},{"text":" ","type":"text"},{"text":"And it doesn’t automatically reflect changes the user makes outside of the app.","type":"text"}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Convert-between-model-types","kind":"section","type":"section","url":"/tutorials/app-dev-training/saving-reminders#Convert-between-model-types","title":"Convert between model types"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Using-popover-tips-in-Article-Accelerator":{"title":"Using popover tips in Article Accelerator","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Using-popover-tips-in-Article-Accelerator","abstract":[{"type":"text","text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app."},{"type":"text","text":" "},{"type":"text","text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app."}],"type":"section","url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Using-popover-tips-in-Article-Accelerator","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#Tour-of-the-app":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-today#Tour-of-the-app","type":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/getting-started-with-today#Tour-of-the-app","abstract":[{"type":"text","text":"Learn to develop a fully functional app with the UIKit framework."}],"kind":"section","title":"Tour of the app"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Considering-user-data":{"kind":"section","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Considering-user-data","url":"/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Considering-user-data","title":"Considering user data","role":"pseudoSymbol","abstract":[{"type":"text","text":"Previously, you learned how to create a SwiftData model context and add objects to it."},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll learn how Article Accelerator fetches objects from a persistent store."},{"text":" ","type":"text"},{"text":"And you’ll explore how to sort and filter the objects to list only the objects that you want.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Add-a-theme-view":{"url":"/tutorials/app-dev-training/passing-data-with-bindings#Add-a-theme-view","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/passing-data-with-bindings#Add-a-theme-view","abstract":[{"type":"text","text":"In the previous tutorial, you used bindings to share data between the edit view and individual UI controls within that view."},{"type":"text","text":" "},{"text":"Now, you’ll expand the editing capabilities by building a color theme picker using bindings that allow the theme picker and edit views to share their data.","type":"text"}],"type":"section","role":"pseudoSymbol","kind":"section","title":"Add a theme view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Representing-your-content-hierarchy":{"title":"Representing your content hierarchy","type":"section","kind":"section","abstract":[{"type":"text","text":"Explore aspects of the app’s user experience and visual design."},{"type":"text","text":" "},{"text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app."}],"url":"/tutorials/app-dev-training/exploring-app-design#Representing-your-content-hierarchy","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Representing-your-content-hierarchy","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Views":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Views","abstract":[],"title":"Views","url":"/tutorials/app-dev-training/swiftui/views","kind":"article","type":"topic","role":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Configuring-toolbar-items":{"kind":"section","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/working-with-toolbars#Configuring-toolbar-items","role":"pseudoSymbol","abstract":[{"type":"text","text":"A macOS window has a toolbar at the top of the window’s frame."},{"type":"text","text":" "},{"type":"text","text":"This area displays the title of the window and provides a space for controls and other tools that can access features in your app."}],"title":"Configuring toolbar items","url":"/tutorials/app-dev-training/working-with-toolbars#Configuring-toolbar-items"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Request-access-to-reminder-data":{"abstract":[{"type":"text","text":"With the EventKit framework, you can request access to a user’s calendar events and reminders."},{"text":" ","type":"text"},{"text":"You can use EventKit to share data between the Reminders and Today apps.","type":"text"}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Request-access-to-reminder-data","title":"Request access to reminder data","url":"/tutorials/app-dev-training/loading-reminders#Request-access-to-reminder-data","kind":"section","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Display-the-content-view":{"abstract":[{"text":"In this tutorial, you’ll add capabilities to the app’s editing mode that transform a view-only list of reminder details into editable controls.","type":"text"}],"kind":"section","role":"pseudoSymbol","title":"Display the content view","url":"/tutorials/app-dev-training/using-content-views#Display-the-content-view","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Display-the-content-view","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Respond-to-change-notifications":{"kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Respond-to-change-notifications","url":"/tutorials/app-dev-training/saving-reminders#Respond-to-change-notifications","role":"pseudoSymbol","type":"section","title":"Respond to change notifications","abstract":[{"text":"You still have some important features to add to your app.","type":"text"},{"text":" ","type":"text"},{"text":"When Today closes, it loses changes that the user made within the app.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"And it doesn’t automatically reflect changes the user makes outside of the app."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Display-attendees-in-the-edit-view":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view#Display-attendees-in-the-edit-view","abstract":[{"text":"In this tutorial, you’ll create a new view containing controls to edit a scrum.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"SwiftUI provides all the standard controls for iOS apps."},{"text":" ","type":"text"},{"text":"You’ll add buttons, a slider, and a text field.","type":"text"},{"type":"text","text":" "},{"text":"Then, you’ll update the detail view to present your new edit view.","type":"text"}],"title":"Display attendees in the edit view","kind":"section","url":"/tutorials/app-dev-training/creating-the-edit-view#Display-attendees-in-the-edit-view","type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Using-content-views-in-editing-mode":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Using-content-views-in-editing-mode","type":"section","role":"pseudoSymbol","title":"Using content views in editing mode","url":"/tutorials/app-dev-training/managing-content-views#Using-content-views-in-editing-mode","kind":"section","abstract":[{"text":"Content views let you focus on information that you want to display in a view, without worrying about when to update or how to style a view.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"They work with content configurations to keep your app’s information and user interface in sync."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Make-the-model-identifiable":{"title":"Make the model identifiable","abstract":[{"text":"A ","type":"text"},{"inlineContent":[{"type":"text","text":"diffable data source"}],"type":"emphasis"},{"type":"text","text":" stores a list of identifiers that represents the identities of the items in the collection view."},{"text":" ","type":"text"},{"type":"text","text":"In this tutorial, you’ll make the reminder model "},{"type":"emphasis","inlineContent":[{"text":"identifiable","type":"text"}]},{"type":"text","text":" so that you can uniquely identify each reminder."}],"type":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/making-reminders-identifiable#Make-the-model-identifiable","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Make-the-model-identifiable"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Make-the-date-configuration-editable":{"title":"Make the date configuration editable","kind":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/editing-reminders#Make-the-date-configuration-editable","type":"section","abstract":[{"text":"In this tutorial, you’ll add an editing mode to Today that lets users edit the details of a reminder.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/editing-reminders#Make-the-date-configuration-editable"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/SwiftData":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/macOS/SwiftData","url":"/tutorials/app-dev-training/macos/swiftdata","abstract":[],"role":"article","kind":"article","type":"topic","title":"SwiftData"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Setting-rules":{"title":"Setting rules","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Setting-rules","role":"pseudoSymbol","url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit#Setting-rules","kind":"section","abstract":[{"text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app.","type":"text"}],"type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Conform-to-the-content-view-protocol":{"title":"Conform to the content view protocol","url":"/tutorials/app-dev-training/using-content-views#Conform-to-the-content-view-protocol","role":"pseudoSymbol","type":"section","kind":"section","abstract":[{"text":"In this tutorial, you’ll add capabilities to the app’s editing mode that transform a view-only list of reminder details into editable controls.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Conform-to-the-content-view-protocol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders","kind":"project","url":"/tutorials/app-dev-training/adding-and-deleting-reminders","type":"topic","title":"Adding and deleting reminders","abstract":[{"text":"In this tutorial, you’ll add the ability to create new reminders and delete existing ones.","type":"text"}],"role":"project","estimatedTime":"20min"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Making-editable-views":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Making-editable-views","title":"Making editable views","url":"/tutorials/app-dev-training/uikit/making-editable-views","abstract":[],"role":"article","kind":"article","type":"topic"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Customize-the-appearance-of-the-progress-circle":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Customize-the-appearance-of-the-progress-circle","role":"pseudoSymbol","abstract":[{"text":"Create a progress view in Today so that users can track the percentage of reminders they’ve completed.","type":"text"}],"title":"Customize the appearance of the progress circle","url":"/tutorials/app-dev-training/creating-a-progress-view#Customize-the-appearance-of-the-progress-circle","kind":"section","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view":{"kind":"project","type":"topic","abstract":[{"text":"In this tutorial, you’ll create a new view containing controls to edit a scrum.","type":"text"},{"type":"text","text":" "},{"text":"SwiftUI provides all the standard controls for iOS apps.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"You’ll add buttons, a slider, and a text field."},{"text":" ","type":"text"},{"type":"text","text":"Then, you’ll update the detail view to present your new edit view."}],"role":"project","url":"/tutorials/app-dev-training/creating-the-edit-view","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-the-edit-view","estimatedTime":"30min","title":"Creating the edit view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Wrapping-a-Cocoa-view":{"title":"Wrapping a Cocoa view","type":"section","url":"/tutorials/app-dev-training/integrating-appkit#Wrapping-a-Cocoa-view","kind":"section","abstract":[{"type":"text","text":"The AppKit framework provides a powerful and extensive API for building graphical interfaces for macOS apps."},{"text":" ","type":"text"},{"type":"text","text":"Using AppKit, you’ll create amazing apps that tap into the full power of macOS."}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Wrapping-a-Cocoa-view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Listing-elements-in-a-relationship":{"title":"Listing elements in a relationship","kind":"section","abstract":[{"type":"text","text":"In the previous article, you examined how to define your app’s storage schema in its model code."},{"text":" ","type":"text"},{"type":"text","text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data."}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Listing-elements-in-a-relationship","url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Listing-elements-in-a-relationship","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Creating-a-window-scene":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-multiple-windows#Creating-a-window-scene","role":"pseudoSymbol","abstract":[{"text":"Mac users expect to use multiple windows to multitask, quickly switch between frequently used features of an app, or work with multiple pieces of an app’s content at the same time.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"A window can contain a title, toolbar, menu commands, and keyboard shortcuts to help users work efficiently."}],"title":"Creating a window scene","url":"/tutorials/app-dev-training/supporting-multiple-windows#Creating-a-window-scene","kind":"section","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Generating-data-source-snapshots":{"abstract":[{"type":"text","text":"Collection views manage ordered collections of data items and use customizable layouts to present them."}],"kind":"section","url":"/tutorials/app-dev-training/adopting-collection-views#Generating-data-source-snapshots","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Generating-data-source-snapshots","type":"section","title":"Generating data source snapshots","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Adding,-deleting,-and-filtering-reminders":{"abstract":[],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/UIKit/Adding,-deleting,-and-filtering-reminders","role":"article","type":"topic","url":"/tutorials/app-dev-training/uikit/adding,-deleting,-and-filtering-reminders","kind":"article","title":"Adding, deleting, and filtering reminders"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Wire-a-target-action-pair":{"kind":"section","role":"pseudoSymbol","type":"section","url":"/tutorials/app-dev-training/making-reminders-identifiable#Wire-a-target-action-pair","abstract":[{"type":"text","text":"A "},{"type":"emphasis","inlineContent":[{"text":"diffable data source","type":"text"}]},{"text":" stores a list of identifiers that represents the identities of the items in the collection view.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"In this tutorial, you’ll make the reminder model "},{"type":"emphasis","inlineContent":[{"text":"identifiable","type":"text"}]},{"type":"text","text":" so that you can uniquely identify each reminder."}],"title":"Wire a target-action pair","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Wire-a-target-action-pair"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Create-an-add-action":{"url":"/tutorials/app-dev-training/adding-and-deleting-reminders#Create-an-add-action","abstract":[{"text":"In this tutorial, you’ll add the ability to create new reminders and delete existing ones.","type":"text"}],"title":"Create an add action","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-reminders#Create-an-add-action","role":"pseudoSymbol","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Simulate-persistence-error":{"type":"section","abstract":[{"text":"During the development of your app, you may have encountered and fixed syntax or semantic errors.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"But unexpected issues that are out of your control can still happen."},{"type":"text","text":" "},{"text":"Network connections can break.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Reading data from a file can fail in several ways."}],"url":"/tutorials/app-dev-training/handling-errors#Simulate-persistence-error","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors#Simulate-persistence-error","title":"Simulate persistence error","kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Choosing-when-to-fill-available-space":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/exploring-app-design#Choosing-when-to-fill-available-space","url":"/tutorials/app-dev-training/exploring-app-design#Choosing-when-to-fill-available-space","type":"section","title":"Choosing when to fill available space","abstract":[{"type":"text","text":"Explore aspects of the app’s user experience and visual design."},{"type":"text","text":" "},{"type":"text","text":"In the previous chapters, you reviewed the technical aspects of Article Accelerator and learned some elements of user experience along the way."},{"text":" ","type":"text"},{"text":"In this article, you’ll review more facets of user experience and visual design and learn what to look for in your own app.","type":"text"}],"kind":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Add-design-elements-to-the-meeting-header":{"url":"/tutorials/app-dev-training/managing-state-and-life-cycle#Add-design-elements-to-the-meeting-header","title":"Add design elements to the meeting header","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-state-and-life-cycle#Add-design-elements-to-the-meeting-header","type":"section","kind":"section","abstract":[{"type":"text","text":"Scrumdinger keeps you informed as your scrum changes."},{"text":" ","type":"text"},{"text":"To build this key feature in the app, you’ll use life cycle methods to control a model that manages the scrum state.","type":"text"}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Whats-next":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/refining-your-craft#Whats-next","title":"What’s next?","role":"pseudoSymbol","kind":"section","url":"/tutorials/app-dev-training/refining-your-craft#Whats-next","abstract":[{"text":"You’ve taken the next steps as a developer. Review what you’ve learned, and get ideas about where to go from here.","type":"text"}],"type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Request-authorization-to-device-hardware":{"url":"/tutorials/app-dev-training/transcribing-speech-to-text#Request-authorization-to-device-hardware","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/transcribing-speech-to-text#Request-authorization-to-device-hardware","title":"Request authorization to device hardware","kind":"section","abstract":[{"type":"text","text":"In this tutorial, you’ll add a feature to Scrumdinger that captures and logs meeting transcripts."},{"type":"text","text":" "},{"text":"You’ll request access to device hardware like the microphone and integrate the Speech framework to transcribe live audio to text.","type":"text"}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Navigation-and-modal-presentation":{"url":"/tutorials/app-dev-training/swiftui/navigation-and-modal-presentation","title":"Navigation and modal presentation","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/SwiftUI/Navigation-and-modal-presentation","kind":"article","role":"article","type":"topic","abstract":[]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Finding-inspiration":{"kind":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/finding-more-resources#Finding-inspiration","type":"section","title":"Finding inspiration","abstract":[{"type":"text","text":"You completed this module on SwiftUI and built your first app. Review what you’ve learned, and get ideas about where to go from here."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Finding-inspiration"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#AppKit-in-Article-Accelerator":{"type":"section","url":"/tutorials/app-dev-training/integrating-appkit#AppKit-in-Article-Accelerator","title":"AppKit in Article Accelerator","abstract":[{"type":"text","text":"The AppKit framework provides a powerful and extensive API for building graphical interfaces for macOS apps."},{"type":"text","text":" "},{"type":"text","text":"Using AppKit, you’ll create amazing apps that tap into the full power of macOS."}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#AppKit-in-Article-Accelerator","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Creating-a-custom-content-view":{"role":"pseudoSymbol","abstract":[{"text":"Content views let you focus on information that you want to display in a view, without worrying about when to update or how to style a view.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"They work with content configurations to keep your app’s information and user interface in sync."}],"type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Creating-a-custom-content-view","url":"/tutorials/app-dev-training/managing-content-views#Creating-a-custom-content-view","title":"Creating a custom content view","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit":{"type":"topic","title":"Surfacing app features","url":"/tutorials/app-dev-training/surfacing-app-features-with-tipkit","estimatedTime":"5min","kind":"article","role":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/surfacing-app-features-with-tipkit","abstract":[{"type":"text","text":"In this article, you’ll learn how to use the TipKit framework to help users discover unused features in your app."},{"type":"text","text":" "},{"text":"You’ll learn how to customize the appearance of your tips and control where and when they appear in your app.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Ready-for-more-training":{"type":"section","title":"Ready for more training?","kind":"section","url":"/tutorials/app-dev-training/finding-more-resources#Ready-for-more-training","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Ready-for-more-training","abstract":[{"type":"text","text":"You completed this module on SwiftUI and built your first app. Review what you’ve learned, and get ideas about where to go from here."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Create-a-custom-view-with-a-text-field":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Create-a-custom-view-with-a-text-field","type":"section","abstract":[{"type":"text","text":"In this tutorial, you’ll add capabilities to the app’s editing mode that transform a view-only list of reminder details into editable controls."}],"url":"/tutorials/app-dev-training/using-content-views#Create-a-custom-view-with-a-text-field","role":"pseudoSymbol","kind":"section","title":"Create a custom view with a text field"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Creating-a-custom-content-configuration":{"type":"section","title":"Creating a custom content configuration","role":"pseudoSymbol","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Creating-a-custom-content-configuration","abstract":[{"text":"Content views let you focus on information that you want to display in a view, without worrying about when to update or how to style a view.","type":"text"},{"text":" ","type":"text"},{"text":"They work with content configurations to keep your app’s information and user interface in sync.","type":"text"}],"url":"/tutorials/app-dev-training/managing-content-views#Creating-a-custom-content-configuration"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Display-a-segmented-control":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/filtering-reminders#Display-a-segmented-control","url":"/tutorials/app-dev-training/filtering-reminders#Display-a-segmented-control","type":"section","abstract":[{"text":"For users to more easily access their reminders on the Today app’s main view, you’ll create a ","type":"text"},{"type":"codeVoice","code":"ListStyle"},{"text":" enumeration that separates reminders into three categories: Today, Future, and All.","type":"text"},{"text":" ","type":"text"},{"text":"You’ll also add a segmented control that lets users select different styles for the reminders list.","type":"text"}],"title":"Display a segmented control","role":"pseudoSymbol","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view":{"estimatedTime":"40min","type":"topic","role":"project","url":"/tutorials/app-dev-training/creating-a-progress-view","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view","abstract":[{"type":"text","text":"Create a progress view in Today so that users can track the percentage of reminders they’ve completed."}],"kind":"project","title":"Creating a progress view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-multi-column-navigation","title":"Displaying multicolumn navigation","url":"/tutorials/app-dev-training/displaying-multi-column-navigation","type":"topic","estimatedTime":"5min","kind":"article","abstract":[{"text":"An intuitive navigation structure helps organize your app’s user interface so that users can easily find the content they’re looking for.","type":"text"},{"text":" ","type":"text"},{"text":"In this article, you’ll explore how Article Accelerator uses a multicolumn container to guide users through a hierarchy of information.","type":"text"}],"role":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Format-the-date-and-time":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-cell-info#Format-the-date-and-time","role":"pseudoSymbol","abstract":[{"type":"text","text":"Today uses a collection view to display a list of reminders in a sequence of cells."}],"url":"/tutorials/app-dev-training/displaying-cell-info#Format-the-date-and-time","title":"Format the date and time","kind":"section","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering":{"abstract":[{"text":"Previously, you learned how to create a SwiftData model context and add objects to it.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"In this article, you’ll learn how Article Accelerator fetches objects from a persistent store."},{"type":"text","text":" "},{"type":"text","text":"And you’ll explore how to sort and filter the objects to list only the objects that you want."}],"title":"Fetching, sorting, and filtering data","type":"topic","role":"article","kind":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering","url":"/tutorials/app-dev-training/swiftdata-sorting-and-filtering","estimatedTime":"15min"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Whats-next":{"title":"What’s next?","role":"pseudoSymbol","url":"/tutorials/app-dev-training/displaying-app-settings#Whats-next","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Whats-next","type":"section","kind":"section","abstract":[{"type":"text","text":"macOS apps often offer users a way to customize their experience."},{"text":" ","type":"text"},{"text":"Learn about the different areas where you can surface app settings.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Examine how Article Accelerator creates an app-specific settings window."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes":{"estimatedTime":"5min","url":"/tutorials/app-dev-training/getting-started-with-earthquakes","type":"topic","kind":"article","title":"Getting started with Earthquakes","abstract":[{"text":"Take the next steps in app development, and build an app to download, decode, and present data from a network data source.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Use SwiftUI to build a simple interface to display dynamic data from a concurrent network client."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes","role":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Connecting-with-others":{"title":"Connecting with others","type":"section","abstract":[{"type":"text","text":"You completed this module on SwiftUI and built your first app. Review what you’ve learned, and get ideas about where to go from here."}],"url":"/tutorials/app-dev-training/finding-more-resources#Connecting-with-others","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/finding-more-resources#Connecting-with-others","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client#View-client-data":{"abstract":[{"text":"Start building a network client by building a test client.","type":"text"},{"type":"text","text":" "},{"text":"Test and preview your views without a network.","type":"text"}],"url":"/tutorials/app-dev-training/building-a-network-test-client#View-client-data","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client#View-client-data","kind":"section","type":"section","title":"View client data","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Filtering-articles":{"type":"section","abstract":[{"type":"text","text":"Previously, you learned how to create a SwiftData model context and add objects to it."},{"type":"text","text":" "},{"type":"text","text":"In this article, you’ll learn how Article Accelerator fetches objects from a persistent store."},{"text":" ","type":"text"},{"text":"And you’ll explore how to sort and filter the objects to list only the objects that you want.","type":"text"}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Filtering-articles","role":"pseudoSymbol","kind":"section","title":"Filtering articles","url":"/tutorials/app-dev-training/swiftdata-sorting-and-filtering#Filtering-articles"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata":{"title":"Adding and deleting data","role":"article","url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata","abstract":[{"text":"In the previous article, you examined how to define your app’s storage schema in its model code.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data."}],"kind":"article","estimatedTime":"15min","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata","type":"topic"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Creating-a-settings-window":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-app-settings#Creating-a-settings-window","title":"Creating a settings window","kind":"section","url":"/tutorials/app-dev-training/displaying-app-settings#Creating-a-settings-window","role":"pseudoSymbol","abstract":[{"text":"macOS apps often offer users a way to customize their experience.","type":"text"},{"type":"text","text":" "},{"text":"Learn about the different areas where you can surface app settings.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Examine how Article Accelerator creates an app-specific settings window."}],"type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Configuring-your-custom-content-view":{"title":"Configuring your custom content view","type":"section","abstract":[{"type":"text","text":"Content views let you focus on information that you want to display in a view, without worrying about when to update or how to style a view."},{"type":"text","text":" "},{"type":"text","text":"They work with content configurations to keep your app’s information and user interface in sync."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/managing-content-views#Configuring-your-custom-content-view","role":"pseudoSymbol","url":"/tutorials/app-dev-training/managing-content-views#Configuring-your-custom-content-view","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Decode-earthquake-data":{"kind":"section","url":"/tutorials/app-dev-training/decoding-structured-json#Decode-earthquake-data","title":"Decode earthquake data","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Decode-earthquake-data","abstract":[{"text":"In this tutorial, you’ll use Swift APIs to decode earthquake information that the USGS provides.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"The USGS encodes the earthquake observations in JSON format, which is a popular choice for providing data on the web."},{"text":" ","type":"text"},{"text":"You’ll access child objects within a JSON hierarchy and ignore fields your app doesn’t need.","type":"text"}],"type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#macOS-development":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#macOS-development","kind":"section","url":"/tutorials/app-dev-training/getting-started-with-article-accelerator#macOS-development","abstract":[{"text":"Explore SwiftUI sample code to learn how to build a desktop-class macOS app.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Learn about the development and design principles that make an app feel at home on Mac."}],"role":"pseudoSymbol","title":"macOS development","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Test-decoding-a-location":{"abstract":[{"type":"text","text":"In this tutorial, you’ll use Swift APIs to decode earthquake information that the USGS provides."},{"type":"text","text":" "},{"type":"text","text":"The USGS encodes the earthquake observations in JSON format, which is a popular choice for providing data on the web."},{"type":"text","text":" "},{"type":"text","text":"You’ll access child objects within a JSON hierarchy and ignore fields your app doesn’t need."}],"kind":"section","url":"/tutorials/app-dev-training/decoding-structured-json#Test-decoding-a-location","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/decoding-structured-json#Test-decoding-a-location","title":"Test decoding a location","type":"section","role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Tips-for-success":{"abstract":[{"type":"text","text":"Explore SwiftUI sample code to learn how to build a desktop-class macOS app."},{"type":"text","text":" "},{"type":"text","text":"Learn about the development and design principles that make an app feel at home on Mac."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-article-accelerator#Tips-for-success","kind":"section","title":"Tips for success","type":"section","role":"pseudoSymbol","url":"/tutorials/app-dev-training/getting-started-with-article-accelerator#Tips-for-success"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/Next-steps/Network-data":{"role":"article","kind":"article","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/Next-steps/Network-data","title":"Network data","url":"/tutorials/app-dev-training/next-steps/network-data","abstract":[],"type":"topic"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing":{"title":"Getting ready for editing","role":"project","url":"/tutorials/app-dev-training/getting-ready-for-editing","estimatedTime":"30min","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-ready-for-editing","type":"topic","kind":"project","abstract":[{"type":"text","text":"In this tutorial, you’ll begin implementing an editing mode for Today so that users can modify the details of a reminder they’re viewing."},{"type":"text","text":" "},{"type":"text","text":"You’ll configure the data source for view and editing modes, and add a button that transitions between the two modes."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Add-visual-components-to-the-detail-view":{"url":"/tutorials/app-dev-training/creating-a-navigation-hierarchy#Add-visual-components-to-the-detail-view","abstract":[{"type":"text","text":"You’ve learned how to create SwiftUI views, but you need to know how to navigate between them."},{"text":" ","type":"text"},{"text":"In this tutorial, you’ll create a navigation hierarchy.","type":"text"}],"title":"Add visual components to the detail view","kind":"section","role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-navigation-hierarchy#Add-visual-components-to-the-detail-view","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Wrapping-a-Cocoa-view-controller":{"url":"/tutorials/app-dev-training/integrating-appkit#Wrapping-a-Cocoa-view-controller","role":"pseudoSymbol","title":"Wrapping a Cocoa view controller","abstract":[{"type":"text","text":"The AppKit framework provides a powerful and extensive API for building graphical interfaces for macOS apps."},{"type":"text","text":" "},{"type":"text","text":"Using AppKit, you’ll create amazing apps that tap into the full power of macOS."}],"type":"section","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/integrating-appkit#Wrapping-a-Cocoa-view-controller"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Create-the-card-view":{"title":"Create the card view","url":"/tutorials/app-dev-training/creating-a-card-view#Create-the-card-view","kind":"section","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-card-view#Create-the-card-view","abstract":[{"type":"text","text":"Scrumdinger keeps a list of daily scrums that the user attends, and it displays that list in its root view."}],"role":"pseudoSymbol"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors":{"type":"topic","abstract":[{"text":"During the development of your app, you may have encountered and fixed syntax or semantic errors.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"But unexpected issues that are out of your control can still happen."},{"text":" ","type":"text"},{"text":"Network connections can break.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Reading data from a file can fail in several ways."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/handling-errors","kind":"project","url":"/tutorials/app-dev-training/handling-errors","role":"project","title":"Handling errors","estimatedTime":"20min"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#Tips-for-success":{"title":"Tips for success","role":"pseudoSymbol","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-scrumdinger#Tips-for-success","type":"section","url":"/tutorials/app-dev-training/getting-started-with-scrumdinger#Tips-for-success","abstract":[{"type":"text","text":"Learn the essentials of iOS app development by building a fully functional app using SwiftUI."}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/supporting-drag-and-drop","title":"Supporting drag and drop","url":"/tutorials/app-dev-training/supporting-drag-and-drop","abstract":[{"text":"On macOS, users can drag an item from one place in an app to another location.","type":"text"},{"type":"text","text":" "},{"type":"text","text":"With these drag-and-drop operations, users can perform actions like moving or copying an item."}],"estimatedTime":"10min","type":"topic","role":"article","kind":"article"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Make-the-action-accessible":{"title":"Make the action accessible","url":"/tutorials/app-dev-training/making-reminders-identifiable#Make-the-action-accessible","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/making-reminders-identifiable#Make-the-action-accessible","role":"pseudoSymbol","kind":"section","type":"section","abstract":[{"type":"text","text":"A "},{"inlineContent":[{"type":"text","text":"diffable data source"}],"type":"emphasis"},{"text":" stores a list of identifiers that represents the identities of the items in the collection view.","type":"text"},{"text":" ","type":"text"},{"text":"In this tutorial, you’ll make the reminder model ","type":"text"},{"type":"emphasis","inlineContent":[{"type":"text","text":"identifiable"}]},{"text":" so that you can uniquely identify each reminder.","type":"text"}]},"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Create-relational-constraints":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/creating-a-progress-view#Create-relational-constraints","url":"/tutorials/app-dev-training/creating-a-progress-view#Create-relational-constraints","abstract":[{"text":"Create a progress view in Today so that users can track the percentage of reminders they’ve completed.","type":"text"}],"kind":"section","type":"section","role":"pseudoSymbol","title":"Create relational constraints"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client#Test-the-quake-client":{"abstract":[{"type":"text","text":"Start building a network client by building a test client."},{"type":"text","text":" "},{"text":"Test and preview your views without a network.","type":"text"}],"role":"pseudoSymbol","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/building-a-network-test-client#Test-the-quake-client","kind":"section","type":"section","url":"/tutorials/app-dev-training/building-a-network-test-client#Test-the-quake-client","title":"Test the quake client"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Read-reminders-individually":{"role":"pseudoSymbol","abstract":[{"text":"You still have some important features to add to your app.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"When Today closes, it loses changes that the user made within the app."},{"type":"text","text":" "},{"type":"text","text":"And it doesn’t automatically reflect changes the user makes outside of the app."}],"title":"Read reminders individually","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/saving-reminders#Read-reminders-individually","url":"/tutorials/app-dev-training/saving-reminders#Read-reminders-individually","type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Whats-next":{"abstract":[{"type":"text","text":"You’ve completed this module and studied a macOS sample app."},{"type":"text","text":" "},{"text":"Review what you’ve learned, and get ideas about where to go from here.","type":"text"}],"title":"What’s next?","role":"pseudoSymbol","type":"section","url":"/tutorials/app-dev-training/growing-your-knowledge#Whats-next","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/growing-your-knowledge#Whats-next","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Setting-container-options":{"role":"pseudoSymbol","url":"/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Setting-container-options","kind":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adding-and-deleting-using-swiftdata#Setting-container-options","title":"Setting container options","abstract":[{"text":"In the previous article, you examined how to define your app’s storage schema in its model code.","type":"text"},{"type":"text","text":" "},{"text":"Now, you’ll learn how to define a model container and establish a model context to which you can add instances of your model data.","type":"text"}],"type":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Complete-the-content-view":{"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/using-content-views#Complete-the-content-view","type":"section","abstract":[{"text":"In this tutorial, you’ll add capabilities to the app’s editing mode that transform a view-only list of reminder details into editable controls.","type":"text"}],"role":"pseudoSymbol","title":"Complete the content view","kind":"section","url":"/tutorials/app-dev-training/using-content-views#Complete-the-content-view"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-data-in-a-list":{"title":"Displaying data in a list","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-data-in-a-list","abstract":[{"code":"List","type":"codeVoice"},{"type":"text","text":" is a container view that displays rows of data arranged in a single, scrollable column."},{"text":" ","type":"text"},{"type":"text","text":"In this tutorial, you’ll use a "},{"type":"codeVoice","code":"List"},{"text":" view to display a summary of the user’s daily scrums.","type":"text"},{"text":" ","type":"text"},{"text":"Then, you’ll make the list the main screen of the app.","type":"text"}],"role":"project","kind":"project","estimatedTime":"15min","type":"topic","url":"/tutorials/app-dev-training/displaying-data-in-a-list"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Display-errors-to-the-user":{"abstract":[{"text":"With the EventKit framework, you can request access to a user’s calendar events and reminders.","type":"text"},{"text":" ","type":"text"},{"text":"You can use EventKit to share data between the Reminders and Today apps.","type":"text"}],"title":"Display errors to the user","role":"pseudoSymbol","url":"/tutorials/app-dev-training/loading-reminders#Display-errors-to-the-user","type":"section","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/loading-reminders#Display-errors-to-the-user","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning":{"title":"Continuing your learning","kind":"article","abstract":[{"text":"You completed this introduction to UIKit and built a complete app that integrates with Reminders.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Review what you’ve learned and get ideas about where to go from here."}],"type":"topic","url":"/tutorials/app-dev-training/continuing-your-learning","role":"article","estimatedTime":"5min","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/continuing-your-learning"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-data-in-a-list#Display-a-list-of-daily-scrums":{"role":"pseudoSymbol","type":"section","title":"Display a list of daily scrums","url":"/tutorials/app-dev-training/displaying-data-in-a-list#Display-a-list-of-daily-scrums","abstract":[{"code":"List","type":"codeVoice"},{"text":" is a container view that displays rows of data arranged in a single, scrollable column.","type":"text"},{"text":" ","type":"text"},{"text":"In this tutorial, you’ll use a ","type":"text"},{"type":"codeVoice","code":"List"},{"type":"text","text":" view to display a summary of the user’s daily scrums."},{"type":"text","text":" "},{"type":"text","text":"Then, you’ll make the list the main screen of the app."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/displaying-data-in-a-list#Display-a-list-of-daily-scrums","kind":"section"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Defining-cell-configurations":{"title":"Defining cell configurations","identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/adopting-collection-views#Defining-cell-configurations","abstract":[{"type":"text","text":"Collection views manage ordered collections of data items and use customizable layouts to present them."}],"role":"pseudoSymbol","kind":"section","type":"section","url":"/tutorials/app-dev-training/adopting-collection-views#Defining-cell-configurations"},"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#About-this-module":{"title":"About this module","abstract":[{"text":"Take the next steps in app development, and build an app to download, decode, and present data from a network data source.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Use SwiftUI to build a simple interface to display dynamic data from a concurrent network client."}],"identifier":"doc://com.apple.app-dev-training/tutorials/app-dev-training/getting-started-with-earthquakes#About-this-module","type":"section","kind":"section","url":"/tutorials/app-dev-training/getting-started-with-earthquakes#About-this-module","role":"pseudoSymbol"}},"legalNotices":{"copyright":"Copyright &copy; 2026 Apple Inc. All rights reserved.","termsOfUse":"https://www.apple.com/legal/internet-services/terms/site.html","privacyPolicy":"https://www.apple.com/privacy/privacy-policy"}}