• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:objective-Cについてご相談があります。)

Objective-CでMasterDetailApplicationを試していますが、クリックしたセルの文字列が表示されない問題について

このQ&Aのポイント
  • Objective-CでMasterDetailApplicationを試していますが、クリックしたセルの文字列がDetail画面のLabelに表示されません。一度目のクリックでは表示されず、二度目のクリックで初めて一度目にクリックしたセルの文字列がLabelに表示されます。つまり見た目上は、Labelの表示がクリックより一回分遅れるということです。
  • セルをクリックしてもDetail画面のLabelに文字列が表示されない問題が発生しています。一度目のクリックでは表示されず、二度目のクリックで初めて一度目にクリックしたセルの文字列がLabelに表示されます。問題の解決方法を教えてください。
  • MasterDetailApplicationでセルのクリック時にDetail画面のLabelに文字列を表示する際、一度目のクリックでは表示されず、二度目のクリックで初めて一度目にクリックしたセルの文字列がLabelに表示されます。見た目上は、Labelの表示がクリックより一回分遅れるという現象が発生しています。どのようにすれば問題を解決できるでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

メソッドの実行順と、インスタンス変数への代入の順が逆になっているのは、別回答者のご指摘のとおりですが…… インスタンス変数「_cellMoji」をわざわざ作って、代入と値の参照を別メソッドで行う理由、必然性そのものが、はたしてあるんでしょうか? インスタンス変数を作るなら、テーブルビューのインスタンス変数、ないしプロパティを作ったほうが有益です。 以下、テーブルビューのプロパティ「tableView」を作った上で、メソッドを修正してみました。これで「- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath」メソッドは不用です。 // セグエの設定 // 設定じゃあありません。セグエを実行したときに呼ばれるメソッドです。 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { [self tableView]; // これ、なにやってんの?そしてなにに使ってるの? // セグエを「showDetail」と名付ける // 名付けてなんかいませんよ。実行したセグエのIdentifierが「showDetail」であるかどうかを確認している。 if ([[segue identifier] isEqualToString:@"showDetail"]) { // _cellMojiはid型のインスタンス変数。 // id型じゃなくて、NSString *型と、決めてしまったほうが、あとあとめんどうにならないと思うが? // [[segue destinationViewController] setDetailItem:_cellMoji]; // これを変更 // タップしたセルを取得。 NSIndexPath *path = [self.tableView indexPathForSelectedRow]; UITableViewCell *cell = [self.tableView cellForRowAtIndexPath: path]; // 遷移先のView Controllerのメソッドを実行 [segue.destinationViewController setDetailItem: cell.textLabel.text; } }

noname#213637
質問者

お礼

ご回答ありがとうございます!本当に助かりました! やっと中身が本当に理解できました。私の考えでは、 (1)セルをタップする (2)最初のメソッドの先頭にある[self tableview](下の方に書いたメソッド)  が実行され、セルの中身が取得される (3)if文の中で、取得されたセルの中身が格納された_cellMojiが  destinationViewControllerに転送される ・・・という感じで考えておりました。

その他の回答 (2)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.3

No.2回答に対するお礼> やっと中身が本当に理解できました。 いや、「本当」の理解はできていないと思いますよ。そういうおごりを持たず、謙虚に勉学にいそしんでください。 こういうことをいわれるのは、あなたにとって心外だとはわかっていて、あえていわせてもらいますが、あなたはプログラミングをなめてかかっています。いまのうちに考えを改めないと、目標を達成することはかないませんよ。

noname#213637
質問者

お礼

ご回答ありがとうございます。 すみません、なめてかかっているとは、どのあたりについてのこと なのでしょうか?もっと自力でしっかり調べるべきであるということ でしょうか?

回答No.1

質問に添付されたログの画像を見ればわかると思うんですが、 didSelectRowAtIndexPathよりもprepareForSegueの方が先に 呼ばれているので、prepareForSegueでdestinationViewControllerに セルの文字列を渡す時に_cellMojiにはまだ何も入ってないか 前回格納した値が入ったままなので、Detail画面には前回の値が 表示されます。 以下の参考URLのように、segueの線をUITableViewCellから接続するのではなく、 UIViewControllerから接続し、didSelectRowAtIndexPathの中から performSegueWithIdentifierを呼び出してプログラムでsegueを起動すれば、 自分が意図した順序で呼び出され、正しく表示されるようになります。 (参考) https://gist.github.com/weed/3323922

noname#213637
質問者

お礼

ご回答ありがとうございます!