- ベストアンサー
Objective-CでMasterDetailApplicationを試していますが、クリックしたセルの文字列が表示されない問題について
- Objective-CでMasterDetailApplicationを試していますが、クリックしたセルの文字列がDetail画面のLabelに表示されません。一度目のクリックでは表示されず、二度目のクリックで初めて一度目にクリックしたセルの文字列がLabelに表示されます。つまり見た目上は、Labelの表示がクリックより一回分遅れるということです。
- セルをクリックしてもDetail画面のLabelに文字列が表示されない問題が発生しています。一度目のクリックでは表示されず、二度目のクリックで初めて一度目にクリックしたセルの文字列がLabelに表示されます。問題の解決方法を教えてください。
- MasterDetailApplicationでセルのクリック時にDetail画面のLabelに文字列を表示する際、一度目のクリックでは表示されず、二度目のクリックで初めて一度目にクリックしたセルの文字列がLabelに表示されます。見た目上は、Labelの表示がクリックより一回分遅れるという現象が発生しています。どのようにすれば問題を解決できるでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
メソッドの実行順と、インスタンス変数への代入の順が逆になっているのは、別回答者のご指摘のとおりですが…… インスタンス変数「_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; } }
その他の回答 (2)
- harawo
- ベストアンサー率58% (3742/6450)
No.2回答に対するお礼> やっと中身が本当に理解できました。 いや、「本当」の理解はできていないと思いますよ。そういうおごりを持たず、謙虚に勉学にいそしんでください。 こういうことをいわれるのは、あなたにとって心外だとはわかっていて、あえていわせてもらいますが、あなたはプログラミングをなめてかかっています。いまのうちに考えを改めないと、目標を達成することはかないませんよ。
お礼
ご回答ありがとうございます。 すみません、なめてかかっているとは、どのあたりについてのこと なのでしょうか?もっと自力でしっかり調べるべきであるということ でしょうか?
- Lchan0211b
- ベストアンサー率61% (573/930)
質問に添付されたログの画像を見ればわかると思うんですが、 didSelectRowAtIndexPathよりもprepareForSegueの方が先に 呼ばれているので、prepareForSegueでdestinationViewControllerに セルの文字列を渡す時に_cellMojiにはまだ何も入ってないか 前回格納した値が入ったままなので、Detail画面には前回の値が 表示されます。 以下の参考URLのように、segueの線をUITableViewCellから接続するのではなく、 UIViewControllerから接続し、didSelectRowAtIndexPathの中から performSegueWithIdentifierを呼び出してプログラムでsegueを起動すれば、 自分が意図した順序で呼び出され、正しく表示されるようになります。 (参考) https://gist.github.com/weed/3323922
お礼
ご回答ありがとうございます!
お礼
ご回答ありがとうございます!本当に助かりました! やっと中身が本当に理解できました。私の考えでは、 (1)セルをタップする (2)最初のメソッドの先頭にある[self tableview](下の方に書いたメソッド) が実行され、セルの中身が取得される (3)if文の中で、取得されたセルの中身が格納された_cellMojiが destinationViewControllerに転送される ・・・という感じで考えておりました。