セクション 103
プロファイルエディタの定義
ユーザプロファイルエディタは、主にプロファイルの個々の詳細を変更するさまざまなコントロールで構成されています。バッジなど、プロファイル内の一部の項目は、ユーザが編集できないため、エディタに表示されません。
プロファイルの概要との一貫性を保つために、エディタ内で同じ順序でプロファイルの詳細を追加します。
ステップ 1
ProfileEditor という名前の新しいビューを作成し、ユーザのプロファイルのコピーの下書きへの結束を含めます。
ビューの最初のコントロールはTextFieldで、文字列バインディング(この場合は、ユーザーが選択した表示名)を制御および更新します。 テキストフィールドを作成するときに、ラベルと文字列への拘束を指定します。
    ProfileEditor.swift
- import SwiftUI
- struct ProfileEditor: View {
@Binding var profile: Profile
var body: some View {
List {
HStack {
Text("Username").bold()
Divider()
TextField("Username", text: $profile.username)
}
}
}
- }
- struct ProfileEditor_Previews: PreviewProvider {
static var previews: some View {
ProfileEditor(profile: .constant(.default))
}
- }
プレビュー その 1
ステップ 2
ProfileHost の条件付きコンテンツを更新して、プロファイルエディタを含め、プロファイルの結束を渡します。
これで、[Edit(編集)] をタップすると、プロファイルの編集ビューが表示されます。
    ProfileHost.swift
- import SwiftUI
- struct ProfileHost: View {
@Environment(\.editMode) var editMode
@EnvironmentObject var modelData: ModelData
@State private var draftProfile = Profile.default
var body: some View {
VStack(alignment: .leading, spacing: 20) {
HStack {
Spacer()
EditButton()
}
if editMode?.wrappedValue == .inactive {
ProfileSummary(profile: modelData.profile)
} else {
ProfileEditor(profile: $draftProfile)
}
}
.padding()
}
- }
- struct ProfileHost_Previews: PreviewProvider {
static var previews: some View {
ProfileHost()
.environmentObject(ModelData())
}
- }
ステップ 3
ランドマーク関連のイベントに関する通知を受信するためのユーザの設定に対応するトグルスイッチを追加します。
トグルスイッチはオンまたはオフのいずれかのコントロールであるため、yes または no の設定値などのブール値に適しています。
    ProfileEditor.swift
TextField("Username", text: $profile.username)
}
Toggle(isOn: $profile.prefersNotifications) {
Text("Enable Notifications").bold()
}
}
}
プレビュー その 2
ステップ 4
Picker コントロールとそのラベルを VStack に配置して、ランドマークの写真に選択可能な好みのシーズンを設定できるようにします。
    ProfileEditor.swift
Text("Enable Notifications").bold()
}
VStack(alignment: .leading, spacing: 20) {
Text("Seasonal Photo").bold()
Picker("Seasonal Photo", selection: $profile.seasonalPhoto) {
ForEach(Profile.Season.allCases) { season in
Text(season.rawValue).tag(season)
}
}
.pickerStyle(SegmentedPickerStyle())
}
}
}
プレビュー その 3
ステップ 5
最後に、シーズンセレクターの下に DatePicker を追加して、ランドマークの訪問目標の日付を変更できるようにします。
    ProfileEditor.swift
- import SwiftUI
- struct ProfileEditor: View {
@Binding var profile: Profile
var dateRange: ClosedRange<Date> {
let min = Calendar.current.date(byAdding: .year, value: -1, to: profile.goalDate)!
let max = Calendar.current.date(byAdding: .year, value: 1, to: profile.goalDate)!
return min...max
}
var body: some View {
List {
HStack {
Text("Username").bold()
Divider()
TextField("Username", text: $profile.username)
}
Toggle(isOn: $profile.prefersNotifications) {
Text("Enable Notifications").bold()
}
VStack(alignment: .leading, spacing: 20) {
Text("Seasonal Photo").bold()
Picker("Seasonal Photo", selection: $profile.seasonalPhoto) {
ForEach(Profile.Season.allCases) { season in
Text(season.rawValue).tag(season)
}
}
.pickerStyle(SegmentedPickerStyle())
}
DatePicker(selection: $profile.goalDate, in: dateRange, displayedComponents: .date) {
Text("Goal Date").bold()
}
}
}
- }
- struct ProfileEditor_Previews: PreviewProvider {
static var previews: some View {
ProfileEditor(profile: .constant(.default))
}
- }
プレビュー その 4