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

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

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

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

Q&A

解決済

2回答

5548閲覧

swift tableViewのセル選択時の動作について

comet0310

総合スコア59

Swift

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

1グッド

1クリップ

投稿2016/10/08 04:26

セルにはあらかじめ配列partに入れたstring型の文字を表示しています。
この時セルを選択した時にそのセルの文字を配列passの文字に変えたいのですがこのプログラムではできませんでした。
また再度セルを選択した時にその文字がpassならpartをpartならpassを表示するようにコードを記述しました

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell:UITableViewCell=tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath)
if cell.textLabel!.text==part[indexPath.row]{
cell.textLabel!.text=pass[indexPath.row]
}else{
cell.textLabel!.text=part[indexPath.row]
}
}

セル選択時に何も起こらずただセルがグレーになるだけでした
解決方法を教えてくださいませんか

shuntar30👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

dequeueReusableCell()で返ってくるセルは表示されているセルではありません。表示を更新するために画面に表示中のセルを取得するにはcellForRow(at:)メソッドを使用します。

swift

1override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 2 let cell = tableView.cellForRow(at: indexPath) 3 cell?.textLabel?.text = ... 4}

ただし、ここで変更した内容は、このセルが画面外に出てセルが再利用されるときに失われますので、その場合でも状態を保持したい場合は、選択したという状態を保持して、func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCellメソッドで返すセルもその状態を反映する必要があります。

投稿2016/10/08 11:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

comet0310

2016/10/08 12:38

解決しました! ありがとうございます!
guest

0

選択した時の状態を保持したかったので、Structの配列でモデルを作成しました。
セルを選択した時に呼ばれるデリゲートメソッドdidSelectRowAtでモデルの選択状態を変更して リロードすると文字が変わります。

swift

1import UIKit 2 3class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 @IBOutlet weak var tableView: UITableView! 6 // Data Array 7 var dataArray: Array<DataModel> = [] 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 // データを作成 13 createData() 14 15 tableView.estimatedRowHeight = 44 16 tableView.rowHeight = UITableViewAutomaticDimension 17 } 18 19 func createData() { 20 for i in 0...10 { 21 dataArray.append(DataModel(part: "part -- \(String(i))", pass: "pass ** \(String(i))")) 22 } 23 } 24 25 // MARK: - TableView Delegate & DataSource 26 27 // Row Count 28 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 29 return dataArray.count 30 } 31 32 // Generate Cell 33 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 34 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 35 let data = dataArray[indexPath.row] 36 37 // データの選択状態でpartかpassの文字列を出し分ける 38 cell.textLabel?.text = data.isSelectPass ? data.pass : data.part 39 return cell 40 } 41 42 // Select Cell 43 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 44 tableView.deselectRow(at: indexPath as IndexPath, animated: true) 45 46 // データの選択状態を変更してテーブルをリロード 47 dataArray[indexPath.row].selectChange() 48 tableView.reloadData() 49 } 50} 51 52 53// partとpassを持つデータ 54struct DataModel { 55 56 var part: String! 57 var pass: String! 58 var isSelectPass = false 59 60 init(part: String = "", pass: String = "", isSelectPass: Bool = false) { 61 self.part = part 62 self.pass = pass 63 self.isSelectPass = isSelectPass 64 } 65 66 mutating func selectChange() { 67 self.isSelectPass = !self.isSelectPass 68 } 69}

a

投稿2016/10/08 08:42

編集2016/10/08 08:46
_Kentarou

総合スコア8490

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

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

comet0310

2016/10/08 10:33

すごい丁寧にありがとうございます。 構造体を使ったやり方はとても参考になります。 ちなみに私の書いたコードでは何がいけなかったかを教えてくださいませんか? テーブルをリロードしないと変化しないということでしょうか?
_Kentarou

2016/10/08 10:55 編集

セルは使いまわされているということはご存知ですか?下にスクロールした時に上に消えたセルが下から使いまわされて出てきます。 cellForRowAtのメソッドの中で以下の文でセルのラベルのテキストを表示してみてください。 print(cell.textLabel?.text) そうするとセルが表示された時に前の文字と違う文字のセルが渡されてくることが分かると思います。 なので記載されているコードでは正確な判定ができないということです。
comet0310

2016/10/08 12:39

なるほど、、、 参考になります! 詳しい解説ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問