Closed3
tcaでアラートを使いたい

ドキュメント通りにやってみた
けれど非推奨みたいだった'init(title:message:primaryButton:secondaryButton:)' is deprecated: Use 'init(title:actions:message:)' instead.
'default(_:action:)' is deprecated: Use 'ButtonState(action:label:)' instead.
'cancel(_:action:)' is deprecated: Use 'ButtonState(role: .cancel, action:label:)' instead.

このケーススタティを見ながらやってみる

これでできた!!!!alertのスペルを間違えてしまって、全然動かなくて焦りました
Reducer
@Reducer
struct SampleReducer{
@ObservableState
struct State{
@Presents var alert: AlertState<Action.Alert>?
}
enum Action {
case alertButtonTapped
case alert(PresentationAction<Alert>)
@CasePathable
enum Alert {
case cancelTapped
case confirmTapped
}
}
}
var body: some ReducerOf<Self> {
Reduce {state, action in
switch action {
case .alert(.presented(.cancelTapped)):
//キャンセルボタン押した時の処理
state.alert = nil
return .none
case.alert(.presented(.confirmTapped)):
//OKボタンをタップした時の処理
state.alert = nil
return .none
case .alertButtonTapped:
state.alert = AlertState {
TextState("タイトル")
} actions: {
ButtonState(action: .cancelTapped) {
TextState("Cancel")
}
ButtonState(action: .confirmTapped) {
TextState("OK")
}
} message: {
TextState("本文")
}
return .none
case .alert:
return .none
}
}
.ifLet(\.$alert, action: \.alert)
}
}
View
struct SampleView: View {
@Bindable var store: StoreOf<SampleReducer>
var body: some View {
Button {
store.send(.alertButtonTapped)
} label: {
Text("アラートを出す")
}
.alert($store.scope(state: \.alert, action: \.alert))
}
}
```
このスクラップは2024/12/23にクローズされました