# 画面設計書 48-SubSettings画面

## 概要

本ドキュメントはWikipedia iOSアプリにおける設定サブ画面基底クラス（SubSettingsViewController）の設計内容を記載したものです。

### 本画面の処理概要

SubSettingsViewController は、設定画面のサブ画面（SearchSettings、AppearanceSettings、ExploreFeedSettings等）の共通基盤となる抽象基底クラスです。TableViewをベースとしたレイアウトと、テーマ対応機能を提供します。この画面自体は直接表示されることはなく、各種設定画面がこのクラスを継承して具体的な機能を実装します。

**業務上の目的・背景**：設定画面群の共通機能（TableView構造、テーマ対応、アクセシビリティ対応）を一元管理することで、コードの重複を避け、一貫したUI/UXを提供します。新しい設定画面を追加する際も、このクラスを継承することで基本的な画面構造が自動的に提供されます。

**画面へのアクセス方法**：直接アクセスすることはありません。各種設定画面（SearchSettings、AppearanceSettings等）の基底クラスとして機能します。

**主要な操作・処理内容**：
1. UITableViewの基本構造を提供
2. テーマ対応（Themeable）機能の継承
3. アクセシビリティ（VoiceOver Escape）対応
4. NIBファイルからのレイアウト読み込み

**画面遷移**：
- 遷移元：継承クラスによる（Settings画面など）
- 遷移先：継承クラスによる

**権限による表示制御**：継承クラスの実装に依存します。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | 設定画面基盤 | 主機能 | 各種設定画面の親クラスとして機能 |

## 画面種別

基底クラス（抽象画面）

## URL/ルーティング

該当なし（基底クラスのため直接アクセスされない）

## 入出力項目

継承クラスの実装に依存します。基底クラスとして以下のインターフェースを提供：

| 項目名 | 項目ID | データ型 | 入力/出力 | 必須 | 説明 |
|--------|--------|----------|-----------|------|------|
| テーマ | theme | Theme | 入出力 | - | 画面のテーマ設定（ThemeableViewControllerから継承） |

## 表示項目

| 項目名 | データ型 | 説明 |
|--------|----------|------|
| tableView | UITableView | 設定項目を表示するTableView（IBOutlet） |

## イベント仕様

### 1-アクセシビリティエスケープ

VoiceOverユーザーが2本指でZジェスチャーを行った際の処理。

1. `accessibilityPerformEscape()`が呼び出される
2. `dismiss(animated: true)`で画面を閉じる
3. trueを返してジェスチャー処理完了を通知

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

継承クラスの実装に依存します。基底クラス自体はデータベース操作を行いません。

## メッセージ仕様

継承クラスの実装に依存します。

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| numberOfSections未オーバーライド | assertionFailure("Subclassers should override") |
| numberOfRowsInSection未オーバーライド | assertionFailure("Subclassers should override") |
| cellForRowAt未オーバーライド | assertionFailure("Subclassers should override") |

## 備考

- 本クラスはThemeableViewControllerを継承
- NIBファイル名は"SubSettingsViewController"
- UITableViewDataSourceとUITableViewDelegateを採用
- 継承クラスは必ずTableViewのデータソースメソッドをオーバーライドすること
- 継承クラスの例：SearchSettingsViewController、AppearanceSettingsViewController、ExploreFeedSettingsViewController等

---

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

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

### 推奨読解順序

#### Step 1: クラス構造を理解する

まず、クラスの継承構造とプロパティを理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | SubSettingsViewController.swift | `Wikipedia/Code/SubSettingsViewController.swift` | クラス定義（3行目） |
| 1-2 | ThemeableViewController.swift | `Wikipedia/Code/ThemeableViewController.swift` | 親クラスの構造（全体） |

**読解のコツ**: SubSettingsViewControllerはThemeableViewControllerを継承し、さらにUITableViewDataSourceとUITableViewDelegateを採用しています。

#### Step 2: NIBとIBOutletを理解する

NIBファイルからのレイアウト読み込みを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SubSettingsViewController.swift | `Wikipedia/Code/SubSettingsViewController.swift` | nibNameプロパティ（6-8行目） |
| 2-2 | SubSettingsViewController.swift | `Wikipedia/Code/SubSettingsViewController.swift` | tableView IBOutlet（4行目） |

**主要処理フロー**:
1. **4行目**: tableViewのIBOutlet定義
2. **6-8行目**: nibNameで"SubSettingsViewController"を返却

#### Step 3: アクセシビリティ対応を理解する

VoiceOver対応の実装を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | SubSettingsViewController.swift | `Wikipedia/Code/SubSettingsViewController.swift` | accessibilityPerformEscape()（10-13行目） |

**主要処理フロー**:
- **11行目**: dismiss(animated: true)で画面を閉じる
- **12行目**: trueを返してジェスチャー処理完了を通知

#### Step 4: データソースの抽象メソッドを理解する

継承クラスがオーバーライドすべきメソッドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | SubSettingsViewController.swift | `Wikipedia/Code/SubSettingsViewController.swift` | UITableViewDataSource実装（16-31行目） |

**主要処理フロー**:
- **17-20行目**: numberOfSections - assertionFailureを発生させ、継承クラスでのオーバーライドを強制
- **22-25行目**: numberOfRowsInSection - 同上
- **27-30行目**: cellForRowAt - 同上

#### Step 5: 継承クラスでの使用例を理解する

実際の継承クラスでの実装パターンを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | SearchSettingsViewController.swift | `Wikipedia/Code/SearchSettingsViewController.swift` | SubSettingsViewControllerの継承（16行目） |
| 5-2 | AppearanceSettingsViewController.swift | `Wikipedia/Code/AppearanceSettingsViewController.swift` | SubSettingsViewControllerの継承（52行目） |

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

```
ThemeableViewController
    │
    └─ SubSettingsViewController
           │
           ├─ @IBOutlet tableView: UITableView
           │
           ├─ nibName → "SubSettingsViewController"
           │
           ├─ accessibilityPerformEscape()
           │      └─ dismiss(animated: true)
           │
           ├─ numberOfSections(in:) [抽象]
           │      └─ assertionFailure("Subclassers should override")
           │
           ├─ tableView(_:numberOfRowsInSection:) [抽象]
           │      └─ assertionFailure("Subclassers should override")
           │
           ├─ tableView(_:cellForRowAt:) [抽象]
           │      └─ assertionFailure("Subclassers should override")
           │
           └─ [継承クラス]
                  ├─ SearchSettingsViewController
                  ├─ AppearanceSettingsViewController
                  ├─ ExploreFeedSettingsViewController
                  ├─ StorageAndSyncingSettingsViewController
                  ├─ AccountViewController
                  └─ YearInReviewSettingsViewController
```

### データフロー図

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

NIBファイル ─────────────▶ SubSettingsViewController ───▶ tableView配置
(SubSettingsViewController.xib)    │
                                   │
Theme ──────────────────────▶ apply(theme:) ────────────▶ UI更新
(ThemeableViewControllerから)      │                    (継承クラスで実装)
                                   │
VoiceOver ──────────────────▶ accessibilityPerformEscape()
Zジェスチャー                       │
                                   ▼
                            dismiss(animated: true) ───▶ 画面閉じる
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SubSettingsViewController.swift | `Wikipedia/Code/SubSettingsViewController.swift` | ソース | 設定サブ画面基底クラス |
| SubSettingsViewController.xib | `Wikipedia/Code/SubSettingsViewController.xib` | NIB | TableViewのレイアウト定義 |
| ThemeableViewController.swift | `Wikipedia/Code/ThemeableViewController.swift` | ソース | テーマ対応基底クラス |
| SearchSettingsViewController.swift | `Wikipedia/Code/SearchSettingsViewController.swift` | ソース | 継承クラス例（検索設定） |
| AppearanceSettingsViewController.swift | `Wikipedia/Code/AppearanceSettingsViewController.swift` | ソース | 継承クラス例（外観設定） |
| ExploreFeedSettingsViewController.swift | `Wikipedia/Code/ExploreFeedSettingsViewController.swift` | ソース | 継承クラス例（フィード設定） |
| StorageAndSyncingSettingsViewController.swift | `Wikipedia/Code/StorageAndSyncingSettingsViewController.swift` | ソース | 継承クラス例（ストレージ設定） |
| AccountViewController.swift | `Wikipedia/Code/AccountViewController.swift` | ソース | 継承クラス例（アカウント設定） |
