Closed3

tcaでアラートを使いたい

ぴょんさんぴょんさん

ドキュメント通りにやってみた
https://pointfreeco.github.io/swift-composable-architecture/0.45.0/documentation/composablearchitecture/alertstate/
けれど非推奨みたいだった

'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にクローズされました