# 画面設計書 9-ReferenceBackLinks画面

## 概要

本ドキュメントは、Wikipedia iOSアプリのReferenceBackLinks画面の設計仕様を記載したものである。

### 本画面の処理概要

ReferenceBackLinks画面は、記事内の複数の参照元（バックリンク）を順にナビゲートする画面である。同一の参照が記事内の複数箇所で使用されている場合、それらの箇所を前後ボタンで移動できる。

**業務上の目的・背景**：同一の参照が記事内の複数箇所から参照されている場合、ユーザーがそれぞれの参照箇所を効率的に確認できるようにする。「1/3」のようなカウンターで現在位置を表示し、次/前ボタンで循環ナビゲーションを提供。

**画面へのアクセス方法**：Reference画面から複数のバックリンクが存在する場合に表示。

**主要な操作・処理内容**：
1. 現在の参照位置の表示（例: "1/3"）
2. 次の参照元へ移動（下矢印ボタン）
3. 前の参照元へ移動（上矢印ボタン）
4. 閉じるボタンによる画面終了
5. 参照元に戻るボタンによる参照セクションへのジャンプ

**画面遷移**：
- 遷移元：Article画面（参照タップ）
- 遷移先：なし（バックリンク位置へのスクロールのみ）

**権限による表示制御**：なし

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 3 | 参照表示 | 主機能 | 複数参照元のナビゲーション |
| 1 | 記事閲覧 | 親機能 | Article画面との連携 |

## 画面種別

ナビゲーションオーバーレイ

## URL/ルーティング

- エントリーポイント：参照タップ時、バックリンクが複数存在する場合
- Storyboard ID：`ReferenceBackLinksViewController`

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|----------|------|
| 参照ID | 入力 | String | referenceId プロパティ（継承） |
| 参照テキスト | 入力 | String | referenceLinkText プロパティ（継承） |
| バックリンク配列 | 入力 | [ReferenceBackLink] | backLinks プロパティ |
| 現在インデックス | 入出力 | Int | index プロパティ |

## 表示項目

| 項目名 | データソース | 表示条件 | 備考 |
|--------|-------------|----------|------|
| ナビゲーションバー | 継承 | 常時 | ReferenceViewControllerから継承 |
| ツールバー | toolbar | 常時 | 下部に配置 |
| カウントラベル | countLabel | 常時 | "1/3" 形式 |
| 次へボタン | nextButton | 常時 | 下矢印アイコン |
| 前へボタン | previousButton | 常時 | 上矢印アイコン |

## イベント仕様

### 1-次の参照元へ移動

`nextButton`タップで`goToNextReference`メソッドが呼び出される。indexをインクリメントし、配列の末尾を超えた場合は0に戻る（循環ナビゲーション）。その後`notifyDelegateOfNavigationToReference`でデリゲートに通知。

**ソースコード参照**: ReferenceBackLinksViewController.swift 行106-113（goToNextReference）

### 2-前の参照元へ移動

`previousButton`タップで`goToPreviousReference`メソッドが呼び出される。indexをデクリメントし、0未満になった場合は配列末尾に戻る（循環ナビゲーション）。その後`notifyDelegateOfNavigationToReference`でデリゲートに通知。

**ソースコード参照**: ReferenceBackLinksViewController.swift 行116-123（goToPreviousReference）

### 3-デリゲート通知

`notifyDelegateOfNavigationToReference`で現在のバックリンクをデリゲートに通知。`ReferenceBackLinksViewControllerDelegate.referenceBackLinksViewControllerUserDidNavigateTo`を呼び出し、Article画面が該当箇所へスクロール。

**ソースコード参照**: ReferenceBackLinksViewController.swift 行97-104（notifyDelegateOfNavigationToReference）

### 4-カウント表示更新

`notifyDelegateOfNavigationToReference`内で`countLabel.text`を「現在位置/総数」形式で更新（例: "1/3"）。

**ソースコード参照**: ReferenceBackLinksViewController.swift 行99-101

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| なし | - | - | この画面ではデータベース更新なし |

## メッセージ仕様

| メッセージID | メッセージ内容 | 表示条件 | 種別 |
|-------------|---------------|----------|------|
| なし | - | - | この画面固有のメッセージなし |

## 例外処理

- **バックリンクなし**：init時にバックリンク配列が空の場合、nilを返して初期化失敗
- **単一バックリンク**：バックリンクが1件のみの場合、次/前ボタンを無効化

## 備考

- ReferenceBackLinksViewControllerはReferenceViewControllerを継承
- PassthroughViewを使用して背景タップを透過
- 循環ナビゲーション（最後→最初、最初→最後）を実装
- WMFFont.for(.footnote)でカウントラベルのフォントを設定
- アクセシビリティ要素の順序を明示的に設定

---

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

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

### 推奨読解順序

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

バックリンクのデータモデルを理解。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | ReferenceBackLink | `Wikipedia/Code/` | バックリンクモデル（id, text等） |
| 1-2 | ReferenceBackLinksViewControllerDelegate | `Wikipedia/Code/` | デリゲートプロトコル |

**読解のコツ**: ReferenceBackLinkがどのような情報を持つか確認。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | ReferenceBackLinksViewController.swift | `Wikipedia/Code/` | 全体140行 |

**主要処理フロー**:
1. **行19-29 init**: referenceId、referenceText、backLinksを初期化、空配列チェック
2. **行84-93 viewDidLoad**: setupToolbar()、notifyDelegateOfNavigationToReference()
3. **行47-70 setupToolbar**: ツールバー構築、ボタン配置、単一リンク時の無効化

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | ReferenceViewController.swift | `Wikipedia/Code/` | 基底クラスの機能 |

#### Step 4: 呼び出し元を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | ArticleViewController+Reference.swift | `Wikipedia/Code/` | バックリンク画面の表示ロジック |

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

```
ArticleViewController
    │
    └─ ReferenceBackLinksViewController (extends ReferenceViewController)
           │
           ├─ customNavigationBar (inherited)
           │      ├─ closeButton
           │      └─ backToReferenceButton
           │
           ├─ toolbar (bottom)
           │      ├─ countItem (countLabel: "1/3")
           │      ├─ previousButton (up arrow)
           │      └─ nextButton (down arrow)
           │
           └─ ReferenceBackLinksViewControllerDelegate
                  │
                  └─ referenceBackLinksViewControllerUserDidNavigateTo
                         └─ Scroll to BackLink Position
```

### データフロー図

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

Reference Tap ───▶ Check backLinks.count > 1 ───▶ Show ReferenceBackLinksVC
                           │
backLinks[] ──────▶ index (0 → count-1 → 0) ───▶ Circular Navigation
                           │
                           ▼
Next/Prev Tap ────▶ goToNextReference/goToPreviousReference
                           │
                           ▼
                    notifyDelegateOfNavigationToReference
                           │
                           ├──▶ countLabel.text = "1/3"
                           │
                           └──▶ Delegate.userDidNavigateTo(backLink)
                                      │
                                      ▼
                               ArticleVC.scrollToBackLink()
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| ReferenceBackLinksViewController.swift | `Wikipedia/Code/` | ソース | メインViewController（140行） |
| ReferenceViewController.swift | `Wikipedia/Code/` | ソース | 基底クラス |
| ReferenceBackLink.swift | `Wikipedia/Code/` | ソース | バックリンクモデル（推定） |
| ReferenceBackLinksViewControllerDelegate | `Wikipedia/Code/` | プロトコル | デリゲート定義（推定） |
| PassthroughView.swift | `Wikipedia/Code/` | ソース | タップ透過ビュー |
| ArticleViewController+Reference.swift | `Wikipedia/Code/` | ソース | 参照関連の拡張 |
