*

Xcode6_Beta5&SwiftでUITableViewでUINibを使ったカスタムセル(UITableViewCell)を利用する方法

公開日: : 最終更新日:2014/10/21 Swift


スポンサードリンク



前回は、「Xcode5&Objective-CでUITableViewでUINibを使ったカスタムセル(UITableViewCell)を利用する方法」でしたが、本エントリーはXcode6_Beta4&Swiftでカスタムセルを利用する方法となります。

結果的に出来上がるアプリは同じになります。

利用しているXcodeはXcode6_Beta5となります。

Xcodeの操作はXcode5とほぼ同じですので、画面操作のイメージは前回のものを参照ください。

1 プロジェクトの作成

まずは、プロジェクトを作成します。

プロダクト名:SwiftUseUinibTableViewSample
テンプレート:SingleView View Template
デバイス:iPhone
言語:Swift
を指定してプロジェックとを作成してください

2 UITableViewの配置とカスタムセルクラスの作成

UITableViewの配置

Main.storyboardを選択しストーリーボードをエディタエリアに表示し「Table View」を配置します。
Xcodeにおける操作方法は前回と同じです。

配置後にOutlet接続をViewController.swiftに対して行います。
これについても操作方法は前回と同じです。
名前はtableViewとしてください。

テーブルビューをOutlet接続した後のViewController.swiftは以下のようになります。

カスタムセルクラスの作成

これも前回とほぼ同じ操作です。

プロジェクトナビゲーターで右クリックメニューを表示し「New File …」をクリックします。

次比表示される画面では、「cocoa Touch class」を選択し「next」ボタンをクリックします。

次の画面ではclassにCustomTableViewCell、Subclass ofにUITableViewCellを指定し、
Auto create XIB fileをチェックし、言語はSwiftを選択し、「Next」をクリックします。

最後の画面は「create」ボタンを押すだけです。

CustomTableViewCell.swiftとCustomTableViewCell.xibが生成されました。
スクリーンショット 2014-08-05 11.25.48

3 UITableViewのセルにカスタムセルクラスを設定する

Table View Cellを配置し作成したカスタムセルクラスを指定する

Table View Cellの配置

ストーリーボードで配置済みのテーブルビューに「Table View Cell」を配置します。
これも前回のエントリーと操作方法は同じですので、前回の該当箇所を参照ください。

このへんの操作方法はXcode5とXcode6(といってもBeta5ですが・・・)は変わってないですね。

カスタムセルクラスの設定

先ほど配置した「Table View Cell」をストーリーボード上で選択し「Identity inspector」の「Custom Class」にCustomTableViewCellを指定します。

同様に「Table View Cell」を選択した状態で「Attributes inspector」の「identifier」に”Cell”を指定します。

上記2属性の設定を行うインスペクタも同じ、インスペクタ内での属性の位置もXcode5とXcode6で変わってないので分かりやすいですね。

4 xibに固定のラベルを配置し、ViewControllerでカスタムセルを表示するように変更を実施する

xibに固定のラベルを配置

プロジェクトナビゲーターでCustomTableViewCell.xibをクリックし、エディタエリアに表示した後
Labelをxibに配置します。
スクリーンショット 2014-08-05 11.39.41

配置したラベルをダブルクリックして、”Swiftのカスタムセルです。”を入力します。
スクリーンショット 2014-08-05 11.41.32

ViewControllerの変更

いよいよ、作成したカスタムセルをテーブルビューに表示しする部分です。
Objective-Cでは、ヘッダーと実装ファイルが分かれているますが、Swiftにはそんな物はないので、修正対象はViewController.swiftのみとなります。

修正内容としては、以下の5点になります。

  1. テーブルビューを制御するために必要なUITableViewDelegate、UITableViewDataSource両プロトコルの追加
  2. viewDidLoadでtableViewのdelegateとdataSourceにselfをセット
  3. viewDidLoadでtableViewにカスタムセル(CustomTableViewCell)を指定
  4. -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionメソッドを追加
  5. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathメソッドを追加

テーブルビューを制御するために必要なUITableViewDelegate、UITableViewDataSource両プロトコルの追加

Swiftにおけるプロトコル追加はsuper classの後にカンマ区切りで指定できます。当然カンマ区切りで複数のプロトコルを追加できます。

この文法では多重継承になっているような感覚をおぼえますよね・・・、実際の仕様はそうではないのですが、もうすこし良い表現があると思うのですが・・・

viewDidLoadでtableViewのdelegateとdataSourceにselfをセット

これも旧来と同じ考え方ですね、viewDidLoadでセットする処理を追加します。

viewDidLoadでtableViewにカスタムセル(CustomTableViewCell)を指定

これもObjective-Cの時と同じ処理を呼び出します。当然Swiftに変わっていますのでその部分は違います。

セクションの行数とセルの内容を返却するデリゲートのメソッドを追加

セクションの行数を返却するメソッドではとりあえず行数はリテラルの数値の5をリターンするようにしてました。

セルの内容を返却するメソッドではカスタムセルを返却するだけです。

Swiftで?
はnilを許容する宣言用に用いられます。
例えばStringは?を付与しないとnilの値を代入できません。

との変数hogeを宣言するとhogeはnilを許容する変数となります。

コンパイルエラー Type ‘String’ does not conform to protocol ‘NilLiteralConvertible’
がfooの方は発生します。この特性によりSwiftではnil判定を行わなくてもよい箇所が多くなります。

と話がそれましたが、tableView.dequeueReusableCellWithIdentifier(“Cell”)の返却クラスを
as? CustomTableViewCellで変数cellに代入しているので、tableView.dequeueReusableCellWithIdentifier(“Cell”)が返却するクラスがCustomTableViewCellクラスもしくはその継承クラスでない場合は変数cellはnilになります。

C#には言語仕様にasとisがあるので紛らわしいですが、Swiftの言語仕様では
as?を利用した場合でダウンキャストに失敗した場合はnilになります。
asを利用した場合でダウンキャストに失敗した場合ランタイムエラーが発生します。

cellがnilになった時のリカバリー処理が本来は必要といえます・・・

1回目の実行

とりあえず、頭の中では処理が繋がったので実行してみます。
スクリーンショット 2014-08-05 20.04.44

なんと・・・、これはいったい何が起きているのでしょうか?
どう考えてもObjective-Cでは実装の必要が無かったデリゲート先がSwiftでは必要なようです。

セクションの行の高さをセットするデリゲート先のメソッドを追加してみました。

やったー、テーブルに固定文字列を設定したラベルが表示されました。
スクリーンショット 2014-08-05 20.10.23

「Xcode5&Objective-CでUITableViewでUINibを使ったカスタムセル(UITableViewCell)を利用する方法」では、xibにラベルを4つ配置して
その内の2つは動的な値を表示するようにしましたが、その部分は実際に手を動かして実装してみてください。

「Xcode6_Beta4&SwiftでUITableViewでUINibを使ったカスタムセル(UITableViewCell)を利用する方法 」は以上です。

 
関連オススメ書籍


スポンサードリンク

Googleアドセンス

Googleアドセンス




関連記事

iOS(Xcode6とSwift)におけるマルチスレッド(非同期)処理の実装方法その2[GCD(Grand Central Dispatch)の利用]

「iOS(Xcode6とSwift)におけるマルチスレッド処理の実装方法その1」ではNSThread

記事を読む

Xcode6とSwiftでイメージ(画像)やアニメーションを表示する方法

本エントリーでは、Xcode6(言語はSwift)を利用してイメージ(画像)やアニメーションを表示す

記事を読む

Swift(Xcode6-Beta2)でMagicalRecord関連の処理を含んだDAOクラスのユニットテスト(UnitTest:XCTestフレームワーク)を実装する時にハマった事

SwiftでMagicalRecord関連の処理を含んだDAOクラスを作成し、ユニットテスト(XCT

記事を読む

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジェクトをくらいながら、開発開始

記事を読む

Xcode6-Beta3でSwiftでBDDを行うためにQuickを導入し動作させる手順

Clone the repository Create a using Quick Pro

記事を読む

Xcode6-Beta3でSwiftでBDDを行うためにQuickを導入しようと思ったが、all-product-headers.yaml:4:13: error: Could not find closing ]!が発生する

そろそろQuickを利用しようと思いまたまたハマりました。というかハマり中です。 「Quick

記事を読む

Swift入門[公式リファレンスのチュートリアルのSteps2の前半]

「Swift」と「Xcode 6」を少しずつさわっていこうと思ってはいるのですが、「Xcode 6

記事を読む

Swift(Xcode6-Beta2)でStringのメソッド(stringByReplacingCharactersInRange:withString:)のコンパイルが通らない時の対処

SwiftでStringのメソッド stringByReplacingCharactersInRa

記事を読む

2014年の秋のAppleのプレスイベントとXcode6-beta-7のインストール方法

2014年の秋のAppleのプレスイベント いよいよAppleは、米国西海岸時間9月9日午前10時

記事を読む

Swift入門[公式リファレンスのチュートリアルのSteps2の後半]

「Swift入門」では、Steps2の前半まで説明させていただきました。 本エントリーでは、

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジ

no image
Ruby on rails4系でBootstrapを利用するためのtips

MacでRuby on rails4系のBootstrapを利用しよう

no image
Java、Eclipse、JUnit関連のエントリーの移行のお知らせ

Java、Eclipse、JUnit関連のエントリーは http:/

iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]

iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」

前回はSwiftの概要をザックリと説明させていただきました。 今

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑