# 画面設計書 41-SearchSettings画面

## 概要

本ドキュメントはWikipedia iOSアプリにおける検索設定画面（SearchSettingsViewController）の設計内容を記載したものです。

### 本画面の処理概要

SearchSettings画面は、Wikipedia iOSアプリの検索機能に関する各種設定を行うための画面です。ユーザーは検索時の言語バー表示やアプリ起動時のタブ選択などの設定をカスタマイズできます。

**業務上の目的・背景**：ユーザーが検索機能をより効率的に使用できるよう、検索に関連する表示設定やアプリ起動時の挙動をカスタマイズする機能を提供します。多言語Wikipediaを利用するユーザーにとって、言語バーの表示有無は検索効率に大きく影響するため、個人の使用スタイルに合わせた設定が可能です。

**画面へのアクセス方法**：設定画面（Settings）から「Search」項目をタップすることでこの画面に遷移します。

**主要な操作・処理内容**：
1. 検索画面で言語バーを表示するかどうかの切り替え（Show languages on search）
2. アプリ起動時にSearchタブを開くかどうかの切り替え（Open app on Search tab）
3. 設定変更時はUserDefaultsに即座に保存される

**画面遷移**：
- 遷移元：Settings画面
- 遷移先：なし（設定変更のみ）

**権限による表示制御**：特になし。すべてのユーザーが同じ設定項目にアクセス可能です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 48 | 検索設定 | 主機能 | 検索関連の設定を管理 |

## 画面種別

設定（スイッチ切替型設定画面）

## URL/ルーティング

iOSネイティブアプリのため、URLは使用しない。画面遷移はUINavigationControllerのpush遷移で管理。

## 入出力項目

| 項目名 | 項目ID | データ型 | 入力/出力 | 必須 | 説明 |
|--------|--------|----------|-----------|------|------|
| 言語バー表示 | showLanguagesOnSearch | Bool | 入出力 | - | 検索画面で言語バーを表示するか |
| 検索タブで開く | openAppOnSearchTab | Bool | 入出力 | - | アプリ起動時にSearchタブを開くか |

## 表示項目

| 項目名 | データ型 | 説明 |
|--------|----------|------|
| ナビゲーションタイトル | String | "Search" |
| 言語バー表示設定 | Switch | 言語バーの表示有無を切り替え |
| 検索タブ起動設定 | Switch | アプリ起動時のタブ選択を切り替え |
| セクションフッター | String | 設定項目の説明テキスト |

## イベント仕様

### 1-言語バー表示スイッチ切替

ユーザーが「Show languages on search」のスイッチを切り替えた際の処理。

1. `WMFSettingsTableViewCellDelegate`の`settingsTableViewCell(_:didToggleDisclosureSwitch:)`が呼び出される
2. controlTagが1の場合、`UserDefaults.standard.wmf_setShowSearchLanguageBar(sender.isOn)`を実行
3. `reloadSectionData()`でセクションデータを再読み込み

### 2-検索タブ起動スイッチ切替

ユーザーが「Open app on Search tab」のスイッチを切り替えた際の処理。

1. `WMFSettingsTableViewCellDelegate`の`settingsTableViewCell(_:didToggleDisclosureSwitch:)`が呼び出される
2. controlTagが2の場合、`UserDefaults.standard.wmf_openAppOnSearchTab = sender.isOn`を実行
3. `reloadSectionData()`でセクションデータを再読み込み

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 言語バー表示切替 | UserDefaults | UPDATE | wmf_showSearchLanguageBarキーの値を更新 |
| 検索タブ起動切替 | UserDefaults | UPDATE | wmf_openAppOnSearchTabキーの値を更新 |

### テーブル別更新項目詳細

#### UserDefaults

| 操作 | 項目（キー名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | wmf_showSearchLanguageBar | Bool（true/false） | 検索画面の言語バー表示設定 |
| UPDATE | wmf_openAppOnSearchTab | Bool（true/false） | アプリ起動時のタブ設定 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| settings-language-bar | ラベル | "Show languages on search" | 言語バー設定項目のタイトル |
| settings-search-open-app-on-search | ラベル | "Open app on Search tab" | 検索タブ設定項目のタイトル |
| settings-search-footer-text | フッター | "Set the app to open to the Search tab instead of the Explore tab" | セクションフッターの説明 |

## 例外処理

特別な例外処理は実装されていません。UserDefaultsへの読み書きは同期的に行われ、失敗時の特別なエラーハンドリングはありません。

## 備考

- 本画面はSubSettingsViewControllerを継承しており、設定画面共通のTableView構造を使用
- テーマ対応済み（Themeableプロトコル準拠）
- WMFNavigationBarConfiguringプロトコルに準拠し、統一されたナビゲーションバーを表示

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、設定項目を表現するデータ構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | SearchSettingsViewController.swift | `Wikipedia/Code/SearchSettingsViewController.swift` | Section構造体とItem構造体の定義（4-13行目） |

**読解のコツ**: Section構造体がTableViewのセクションを、Item構造体が各設定項目を表現しています。controlTagでスイッチの識別を行います。

#### Step 2: エントリーポイントを理解する

処理の起点となるViewControllerのライフサイクルメソッドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SearchSettingsViewController.swift | `Wikipedia/Code/SearchSettingsViewController.swift` | viewDidLoad()の処理（19-26行目） |

**主要処理フロー**:
1. **19行目**: viewDidLoad()でTableViewのセルを登録
2. **21-22行目**: WMFSettingsTableViewCellのNibを登録
3. **25行目**: reloadSectionData()で設定データを初期化

#### Step 3: セクションデータの構築を理解する

設定項目がどのように構築されるかを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | SearchSettingsViewController.swift | `Wikipedia/Code/SearchSettingsViewController.swift` | reloadSectionData()メソッド（40-46行目） |

**主要処理フロー**:
- **41行目**: showLanguagesOnSearch項目の生成、UserDefaultsから現在値を取得
- **42行目**: openAppOnSearchTab項目の生成
- **43-45行目**: セクションとフッターテキストの設定

#### Step 4: スイッチ操作のハンドリングを理解する

ユーザーがスイッチを操作した際の処理フローを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | SearchSettingsViewController.swift | `Wikipedia/Code/SearchSettingsViewController.swift` | WMFSettingsTableViewCellDelegateの実装（116-129行目） |

**主要処理フロー**:
- **118行目**: controlTagでどのスイッチが操作されたか判定
- **119-121行目**: tag=1の場合、言語バー設定を更新
- **122-123行目**: tag=2の場合、検索タブ設定を更新
- **127行目**: reloadSectionData()でUIを更新

### プログラム呼び出し階層図

```
SearchSettingsViewController
    │
    ├─ viewDidLoad()
    │      ├─ tableView.register() - セル登録
    │      └─ reloadSectionData() - データ初期化
    │
    ├─ viewWillAppear()
    │      └─ configureNavigationBar() - ナビバー設定
    │
    ├─ tableView(_:cellForRowAt:)
    │      └─ WMFSettingsTableViewCell - セル構成
    │
    └─ settingsTableViewCell(_:didToggleDisclosureSwitch:)
           ├─ UserDefaults.standard.wmf_setShowSearchLanguageBar()
           ├─ UserDefaults.standard.wmf_openAppOnSearchTab
           └─ reloadSectionData()
```

### データフロー図

```
[入力]                    [処理]                         [出力]

ユーザー操作 ──────▶ UISwitch.valueChanged ──────▶ UserDefaults更新
(スイッチ切替)              │
                          ▼
                   settingsTableViewCell
                   (_:didToggleDisclosureSwitch:)
                          │
                          ▼
                   reloadSectionData() ──────────▶ TableView更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SearchSettingsViewController.swift | `Wikipedia/Code/SearchSettingsViewController.swift` | ソース | メインのViewController |
| SubSettingsViewController.swift | `Wikipedia/Code/SubSettingsViewController.swift` | ソース | 親クラス（設定画面共通基盤） |
| SubSettingsViewController.xib | `Wikipedia/Code/SubSettingsViewController.xib` | NIB | TableViewのレイアウト定義 |
| WMFSettingsTableViewCell.swift | `Wikipedia/Code/WMFSettingsTableViewCell.swift` | ソース | 設定項目用カスタムセル |
| ThemeableViewController.swift | `Wikipedia/Code/ThemeableViewController.swift` | ソース | テーマ対応基底クラス |
