質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

6069閲覧

【iOS,Swift】選択されたCellの種類によって画面遷移先を振り分ける処理

Kesth

総合スコア83

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2015/10/09 08:38

編集2015/10/09 08:54

UITableViewController+UINavigationControllerによる
画面遷移の方法について質問させてください。

まずはじめに、UITableViewController+UINavigationControllerの画面遷移の方法は
下記の様なdidSelectRowAtIndexPathプロパティの中でpushViewControllerを
定義して画面遷移させる方法が一般的だと思います。

Swift

1 func tableView(tableView: UITableView, didSelectRowAtIndexPath index 2Path: NSIndexPath) { 3 4 switch indexPath.row{ 5 case 1: 6 self.navigationController?.pushViewController(HogeViewController(), animated: true) 7 default: 8 break 9 10 } 11 }

上記の方法は、既に各indexPath.rowに格納されるセルが固定の場合は
使えますが、それぞれの列に格納される種類が変動する場合には
使用できません。
(例えば、アプリの設定画面などで使用されているUITableViewControllerの場合は
表示の順序が固定のため上記方法が適用できますが、SNSの通知画面など
表示されるセルが動的に変化する場合は使用できないと思います)

その上で、今回質問させていただきたいのは、表示されるセルの順序が動的に変化する場合においてユーザーがタップしたセルの種類によって遷移先の画面を振り分ける方法についてです。

例えば、UITableViewControllerに表示されるHogeCell1, HogeCell2, HogeCell3という3種類のカスタムセルがあり、それぞれの遷移先をHogeVC1, HogeVC2, HogeVC3とした場合、どのような処理を書けばよろしいでしょうか?

現在下記のようなコードを書いていますが、画面遷移が発生しないので
ご教授頂ければ幸いです。

よろしくお願いします。

※追記
下記のコードを試したのですが、let hogeCell1 = 〜のところで
「Thread1: signal SIGABRT」のエラーが出てしまいました。
どこが間違っているでしょうか?

Swift

1 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 2 3 let hogeCell1 = tableView.cellForRowAtIndexPath(indexPath) as! HogeCell1() 4 let hogeCell2 = tableView.cellForRowAtIndexPath(indexPath) as! HogeCell2() 5 let hogeCell3 = tableView.cellForRowAtIndexPath(indexPath) as! HogeCell3() 6 7 switch indexPath.row{ 8 case hogeCell1: 9 self.navigationController?.pushViewController(HogeVC1(), animated: true) 10 case hogeCell2: 11 self.navigationController?.pushViewController(HogeVC2(), animated: true) 12 case hogeCell3: 13 self.navigationController?.pushViewController(HogeVC3(), animated: true) 14 15 default: 16 break 17 18 } 19 20 } 21

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

下記のコードを試したのですが、let hogeCell1 = 〜のところで
「Thread1: signal SIGABRT」のエラーが出てしまいました。
どこが間違っているでしょうか?

これは、tableView.cellForRowAtIndexPath(indexPath)で得られたオブジェクトがHogeCell2クラスかHogeCell3クラスなのに、HogeCell1クラスを格納する変数に代入しようとしたから例外が発生したのだと思います。

例えば、UITableViewControllerに表示されるHogeCell1, HogeCell2, HogeCell3という3種類のカスタムセルがあり、それぞれの遷移先をHogeVC1, HogeVC2, HogeVC3とした場合、どのような処理を書けばよろしいでしょうか?

選択されたセルのクラスに応じて遷移するViewControllerを変えたいなら、一旦UITableViewCellクラスの変数にセルオブジェクトを代入して、isKindOfClassで実際のクラスを調べればできます。
次のような感じです。

Swift

1let cell = tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell! 2if cell.isKindOfClass(HogeCell1) { 3 self.navigationController?.pushViewController(HogeVC1(), animated: true) 4} else if cell.isKindOfClass(HogeCell2) { 5 self.navigationController?.pushViewController(HogeVC2(), animated: true) 6} else if cell.isKindOfClass(HogeCell3) { 7 self.navigationController?.pushViewController(HogeVC3(), animated: true) 8} 9

ただ一般的には、テーブル表示が動的に変化するということは、そのテーブル表示の元となっているデータの順序も動的に変化しているはず(というか、元データが示した順序通りにテーブル表示されているはず)です。であれば、indexPathに対応する元データを取得し、その元データに入っている情報を見て適切なViewControllerに遷移すればよい話だと思います(テーブル表示処理で、指定されたindexPath位置のカスタムセルを元データを見て選択したのと同じように、遷移先のViewControllerも元データを見て選択すればよい話だと思います)。

投稿2015/10/09 18:06

編集2015/10/09 18:22
TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kesth

2015/10/13 13:55

お返事が遅くなってしまいすみません。 コメントありがとうございます! isKindOfClassを使った方法はとてもシンプルでいいですね。 シンプルで理解しやすいのでベストアンサーにさせて頂きました。
guest

0

同じようなコードを書いたことがあります。
結論から言うと、動的に並び替えを行うメソッド上で配列の順番を並び替えて実装できます。

以下はtableViewのsetEditing機能を使って実装する時ですが、
移動前と移動後のindexPathが取得できますので、以下のように実装が可能です。

swift

1 2//contents:String[] = {'a','b','c','d','e'} 3//sourceIndexPath = 0 4//destinationIndexPath = 3 だったとして、、 5 6func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { 7 let src:Int = sourceIndexPath.row //簡単のため、変数名をわかりやすくしておきますね。 8 let dst:Int = destinationIndexPath.row 9 10 let cacheF:String = contents[src] as! String // srcの位置にある値をキャッシュ 11 contents.removeObjectAtIndex(src) //srcの位置にある値を削除 12 contents.insertObject(cacheF, atIndex: dst) //dstの位置にキャッシュした値を格納 13 tableViewObject.reloadData() //テーブル更新 14 } 15 16// 上記のメソッドを通ると、 contents = {'b','c','d','a','e'} となっているはずです。 17

私の場合は配列の中身がStringでしたが、
これをViewControllerのインスタンスにすれば要件の動作ができると思います。

投稿2015/10/09 09:25

編集2015/10/10 01:26
SKYYFISH

総合スコア654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kesth

2015/10/13 13:53

お返事が遅くなってしまい、すみません! コメントありがとうございます。 コメントアウトを多用して頂きとても丁寧に書いてもらって 大変ありがたいのですが、僕の理解がまだ進まない部分がありましたので 上の方をベストアンサーにさせて頂きました。 これからもよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問