# 画面設計書 71-DisambiguationPages画面

## 概要

本ドキュメントは、Wikipedia iOSアプリの曖昧さ回避ページ一覧画面（DisambiguationPagesViewController）の設計を記述したものである。

### 本画面の処理概要

DisambiguationPages画面は、同一のタイトルを持つ複数のWikipedia記事（曖昧さ回避）が存在する場合に、ユーザーが目的の記事を選択できるようにする一覧画面である。

**業務上の目的・背景**：Wikipediaでは、同名の人物、地名、作品などが複数存在することが多い。ユーザーが記事内のリンクをタップした際に、リンク先が曖昧さ回避ページである場合、どの記事を閲覧したいかを選択させる必要がある。本画面はその選択肢を一覧形式で提示し、ユーザーのナビゲーションを補助する役割を担う。

**画面へのアクセス方法**：Article画面において、曖昧さ回避リンク（同名の複数記事へのリンク）をタップすることで本画面に遷移する。WebView内のコンテンツ処理で曖昧さ回避が検出されると、対象の記事URL配列と共に本画面がプッシュ遷移で表示される。

**主要な操作・処理内容**：
1. 曖昧さ回避対象の記事一覧をリスト形式で表示する
2. 各記事セルにはサムネイル画像、タイトル、説明文が含まれる
3. 記事をタップすると該当のArticle画面へ遷移する
4. 記事サマリーはバックグラウンドでAPIから取得され、CoreDataに保存される

**画面遷移**：
- 遷移元：Article画面（記事内の曖昧さ回避リンクタップ）
- 遷移先：Article画面（選択した記事の詳細）

**権限による表示制御**：特になし。全ユーザーが同一の操作・表示を利用可能。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 66 | リンク処理 | 主機能 | 曖昧さ回避ページ一覧表示 |

## 画面種別

一覧

## URL/ルーティング

ネイティブ画面のため、URLベースのルーティングは存在しない。ArticleViewControllerから内部的にナビゲーションコントローラ経由でプッシュ遷移される。

## 入出力項目

| 項目名 | 型 | 入力/出力 | 説明 |
|--------|-----|----------|------|
| articleURLs | [URL] | 入力 | 曖昧さ回避対象の記事URLリスト |
| siteURL | URL | 入力 | Wikipedia言語サイトのベースURL |
| dataStore | MWKDataStore | 入力 | データストアインスタンス |
| theme | Theme | 入力 | 適用するテーマ |
| resultLimit | Int | 入力 | 表示する結果の最大数（デフォルト10） |

## 表示項目

| 項目名 | データソース | 説明 |
|--------|-------------|------|
| サムネイル画像 | WMFArticle.imageURL | 記事のサムネイル画像 |
| タイトル | WMFArticle.displayTitle | 記事のタイトル |
| 説明文 | WMFArticle.wikidataDescription | 記事の概要説明 |
| セパレータ | - | セル間の区切り線 |

## イベント仕様

### 1-セル選択

記事セルをタップすると、ArticleCoordinatorを経由して該当記事のArticle画面へ遷移する。遷移時にはデータストア、テーマ情報が引き継がれる。

### 2-画面表示

viewWillAppear時にfetch()メソッドが呼ばれ、articleSummaryControllerを通じて記事サマリー情報がAPI経由で取得・更新される。

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 画面表示 | WMFArticle | UPDATE/INSERT | 記事サマリー情報の取得・更新 |

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

#### WMFArticle

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE/INSERT | displayTitle | APIレスポンスのタイトル | 記事サマリーAPIから取得 |
| UPDATE/INSERT | wikidataDescription | APIレスポンスの説明 | 記事サマリーAPIから取得 |
| UPDATE/INSERT | imageURL | APIレスポンスの画像URL | サムネイル画像用 |

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|---------|---------------|
| page-similar-titles | ヘッダー | 常時 | "Similar pages"（ローカライズ対応） |
| エラー | エラー | API取得失敗時 | エラー内容を表示 |

## 例外処理

| 例外ケース | 処理内容 |
|-----------|---------|
| API取得エラー | wmf_showAlertWithErrorでエラーダイアログを表示 |
| 記事データなし | 空のリストを表示（CoreDataに該当データがない場合） |

## 備考

- ArticleFetchedResultsViewControllerを継承しており、CoreDataのNSFetchedResultsControllerを使用して記事データを管理
- 削除操作は無効化されている（canDelete: false）
- イベントログはcategory: .article、label: .similarPageで記録される

---

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

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

### 推奨読解順序

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

まず、画面で扱うデータモデルと継承構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | WMFArticle | `WMF Framework/Core Data/` | 記事データのCoreDataエンティティ |
| 1-2 | MWKDataStore | `Wikipedia/Code/` | データストアの構造と役割 |

**読解のコツ**: DisambiguationPagesViewControllerは深い継承階層を持つ。ArticleFetchedResultsViewController → ArticleCollectionViewController → ColumnarCollectionViewController → ThemeableViewController → UIViewControllerの順で継承している。

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

処理の起点となるファイル・関数を特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | DisambiguationPagesViewController.swift | `Wikipedia/Code/DisambiguationPagesViewController.swift` | 本画面のメインViewController |

**主要処理フロー**:
1. **行12-19**: initでURLs、siteURL、dataStore、themeを受け取り初期化
2. **行25-30**: setupFetchedResultsControllerでNSFetchedResultsControllerを設定
3. **行32-36**: viewWillAppearでfetch()を呼び出し、ナビゲーションバーを設定
4. **行43-51**: fetch()で記事サマリーをAPIから取得・更新

#### Step 3: 親クラスの機能を理解する

継承元の機能が画面の動作に大きく影響する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | ArticleFetchedResultsViewController.swift | `Wikipedia/Code/ArticleFetchedResultsViewController.swift` | NSFetchedResultsControllerとの連携 |
| 3-2 | ArticleCollectionViewController.swift | `Wikipedia/Code/ArticleCollectionViewController.swift` | 記事コレクション表示の共通処理 |
| 3-3 | ColumnarCollectionViewController.swift | `Wikipedia/Code/ColumnarCollectionViewController.swift` | カラムレイアウトの基盤 |

**主要処理フロー**:
- **ArticleFetchedResultsViewController 行21-26**: article(at:)でFetchedResultsControllerから記事を取得
- **ArticleCollectionViewController 行174-183**: didSelectItemAtでArticleCoordinatorを起動

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

```
DisambiguationPagesViewController
    │
    ├─ init(with:siteURL:dataStore:theme:) [行12-19]
    │      └─ super.init()
    │
    ├─ viewWillAppear(_:) [行32-36]
    │      ├─ fetch() [行43-51]
    │      │      └─ articleSummaryController.updateOrCreateArticleSummariesForArticles()
    │      └─ configureNavigationBar() [行38-41]
    │
    ├─ setupFetchedResultsController(with:) [行25-30]
    │      └─ NSFetchedResultsController設定
    │
    └─ configure(cell:forItemAt:layoutOnly:) [行53-57]
           └─ super.configure(cell:forItemAt:layoutOnly:)
```

### データフロー図

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

articleURLs ───────▶ setupFetchedResultsController() ───▶ NSFetchedResultsController
     │                        │
     │                        ▼
     │               NSPredicate(format: "key IN %@")
     │                        │
     └─────────────▶ fetch() │
                        │     │
                        ▼     ▼
              articleSummaryController    CoreData (WMFArticle)
              .updateOrCreate...()             │
                        │                      │
                        ▼                      ▼
                   REST API              UICollectionView
              (記事サマリー取得)          (記事一覧表示)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| DisambiguationPagesViewController.swift | `Wikipedia/Code/DisambiguationPagesViewController.swift` | ソース | 本画面のメインViewController |
| ArticleFetchedResultsViewController.swift | `Wikipedia/Code/ArticleFetchedResultsViewController.swift` | ソース | FetchedResultsController連携の親クラス |
| ArticleCollectionViewController.swift | `Wikipedia/Code/ArticleCollectionViewController.swift` | ソース | 記事コレクション表示の基底クラス |
| ColumnarCollectionViewController.swift | `Wikipedia/Code/ColumnarCollectionViewController.swift` | ソース | カラムレイアウトの基盤 |
| ArticleRightAlignedImageCollectionViewCell.swift | `Wikipedia/Code/ArticleRightAlignedImageCollectionViewCell.swift` | ソース | 記事表示用セル |
| MWKDataStore.swift | `Wikipedia/Code/MWKDataStore.swift` | ソース | データストア管理 |
| WMFArticle+CoreDataClass.swift | `WMF Framework/Core Data/` | ソース | 記事データモデル |
