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

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

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

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

解決済

4回答

3414閲覧

reloadDataでcellForRowAtIndexPathが呼ばれない。

mm--_--mm

総合スコア113

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2015/12/17 08:23

いつもお世話になっております。

表題の件ですが、xmlparseでサーバーからデータを取得し、そのデータをUITableViewに表示していく処理を実装しているのですが、新しいデータを取得しし、[listtable reloadData];(listtableというのはUITableViewをヘッダファイルに定義した時に自分でつけた名前)をしてもnumberOfRowsInSectionまでしか実行しません...。

現在の状況としましては、
1, numberOfRowsInSectionは0ではなく、新しく更新して表示したいデータの数を返している。

2,サーバからデータをxmlparseで取得する際にサーバから通知がきてイベントがか発生し、関数が呼ばれるのですがこの関数内でNSThread.currentThread.isMainThread?でログを取得したところ、結果はNOでした。
このイベントが発生して呼ばれる関数内でxmlparseをして[listtable reloadData];をしようとすると更新がされません...
なお、xmlparseをしている関数もNSThread.currentThread.isMainThread?でログを確認するとNOでした。
reloadDataを行っている関数は6の方法で行っているのでメインスレッドで行われていると思っています...

3,UIButtonでボタンを生成し、ボタンを押したらxmlparseでデータを取得し[listtable reloadData];という流れで処理を行うと問題なく更新される。
NSThread.currentThread.isMainThread?でログを確認するとYESだった。

4,UITableViewはloadviewで生成してaddsubviewをしている。
viewdidload,viewwillappearで生成しても結果は変わりませんでした...

5,ボタンを押した時のパターンでlisttableの中身をログで確認してみると、nullではなくイベントが発生してのパターンでログを確認したところ、listtableの中身はnullだった。nullの時にUITableviewを生成するという処理を行ってもnullではなくなるのですが,問題の解決には至りませんでした...

6,[listtable reloadData];はメインスレッドで行うようにしている。
*試してたやり方としては下記の通りです。

objective

1 2[listtable reloadData]; 3 4[listtable performSelectorOnMainThread:@selector(reloadData)withObject:nil waitUntilDone:NO]; 5 6dispatch_async(dispatch_get_main_queue(), ^{ 7 [listtable reloadData]; 8}); 9 dispatch_async(dispatch_get_main_queue(), ^{ 10 [listtable reloadData]; 11}); 12

わかりづらくて申し訳ないのですが、
この条件を元に、考えられる解決策を教えていただけると幸いです。
よろしくお願いいたします。

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

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

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

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

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

fuzzball

2015/12/17 08:34

viewDidLoadが2回呼ばれている問題は解決したのでしょうか?
mm--_--mm

2015/12/17 08:55

viewdidloadは使用せずにloadviewを使用しているので解決といえるかどうかわかりませんが、とりあえずは回避しました...
guest

回答4

0

なかなかコードを書いてくれないので地道に聞き出しますが、
このクラスはUIViewControllerを継承しているのでしょうか?

前回の質問でのやり取りの中で、listtableの定義について教えていただきましたが、

objectivec

1@interface hoge : UIViewController 2{ 3 UITableView *listtable; 4} 5@end

これで間違いないでしょうか?


【追記】listtableの書き込み調査

listtableがnilになってしまうということなので、ウォッチポイントを設定して誰が書き込んでいるか調べます。

#1. ブレークポイントを設定

まず、listtable`を初期化しているところにブレークポイントを設定します。
breakpoint

#2. 実行

実行します。設定したブレークポイントで止まるはずです。

#3. ウォッチポイントを設定

Variables Viewでlisttableを右クリックし、Watch "listtable"を選択します。
watchpoint

#4. 再実行

実行を継続します。
continue

#5. 書き込み待ち

これで誰かがlisttableに書き込んだら止まります。

投稿2015/12/17 15:37

編集2015/12/18 00:33
fuzzball

総合スコア16731

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

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

mm--_--mm

2015/12/17 22:20

はい。定義の仕方はそれで間違ってないです。
fuzzball

2015/12/18 00:33

listtableの書き込み調査について追記しました。
mm--_--mm

2015/12/18 00:49

試してみたところ、最初に生成した時はとまりましたが,更新したいタイミングでは止まりませんでした... それと、自分で作成したボタンを押した時にデータが更新されたのですが、その時も止まりませんでした。
fuzzball

2015/12/18 00:54

止まらないのが正常です。 「最初に生成した時はとまりました」とのことですが、私が書いた手順通りだと、3番のウォッチポイント設定以降は止まらないはずです。1番のブレークポイントの設定箇所を違うところにしているのでしょうか?
mm--_--mm

2015/12/18 01:02

止まらないのが正常なのですね。わかりました。 いえ、初期化しているところにブレークポイントを指定しておりまして、実行して初めてその処理をする時にとまったということです。それ以降は止まっておりません。
fuzzball

2015/12/18 01:16

止まらないのにlisttableがnilになっているのでしょうか? 前回も聞きましたが、他にlisttableという名前を使っているところは無いでしょうか?(プロジェクト全体で)
fuzzball

2015/12/18 01:23 編集

TakeOneさんに質問で疑問は解けましたので、こちらへの回答は不要です。 結局、「2回呼ばれている問題」は解決してなかったんですね。
mm--_--mm

2015/12/21 09:44

返信が遅れてしまい大変申し訳ありません。 色々な提案をしていただいたのにも関わらず解決まで至らず、申し訳ありませんでした。 私の稚拙な質問におつき合い頂き、誠にありがとうございました。 次からは、まともな質問ができるように努めますので今後ともよろしくお願いいたします。
fuzzball

2015/12/21 10:11

こちらは好きで回答しているだけで、(機嫌が良ければ)いくらでもお付き合いしますので、気楽に質問していただければと思います。
mm--_--mm

2015/12/21 11:08

暖かいお言葉ありがとうございます。 その時はよろしくお願いいたします。
mm--_--mm

2015/12/24 07:04

無事に解決しました! インスタンスを生成するタイミングを変えたらなんとかなりました。 前回の質問から色々とアドバイスしていただきありがとうございました!
fuzzball

2015/12/24 07:53

良いお年をw
mm--_--mm

2015/12/24 08:00

ありがとうございます! 良いお年を!
guest

0

ベストアンサー

前回の質問でviewDidLoadが2回呼ばれるとか、listtableがnilになっているとか書かれているのを読んで思ったんですが、もしかしてViewControllerのインスタンスを2つ生成したりしていませんか?
表示されているViewControllerともう1つ別のインスタンスのViewControllerがあり、そちらの方のlisttableのreloadDataを実行しようとして、そのlisttableがnilになっているということではないですか?

listtableがnilになっている時とnilになっていない時の両方で、そのlisttableを格納しているViewControllerのアドレスを確認してみてください。
具体的には、
[listtable reloadData];
の前に
NSLog("%@",self);
を実行して、その出力を確認してみてください。
そこで表示されているアドレスが別々のものだったら、表示されているViewControllerと別のViewControllerのlisttableを更新しようとしているということです。

投稿2015/12/18 01:00

TakeOne

総合スコア6299

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

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

mm--_--mm

2015/12/18 01:08

ご回答いただきありがとうございます。確認してみたところ TakeOneさんの通り、アドレスが別のものになっておりました... この原因の対処法はどのようなものなのでしょうか?
TakeOne

2015/12/18 01:52 編集

どこでどのようにViewControllerを生成しているか説明してもらわないとわかりません。 というか、なぜViewControllerが2つ生成されるのか、まずは自分で調べてください。 ViewControllerが2つ生成されていることを意識して、処理の各ポイントでどちらの ViewControllerが使われているか調べれば、何が問題かわかると思います。
mm--_--mm

2015/12/18 02:09

調べてみたところ、2つ生成している箇所を発見しました。 今から色々と調べてみます。わからないことがでてきたら質問させていただきます。 よろしくお願いいたします。
mm--_--mm

2015/12/18 08:31

すみません。質問させてください... 画面Aから画面Bに遷移する時に、インスタンス生成、サーバから通知がきた時に画面Bに記述してある関数を呼ぶためにインスタンス生成、計2回生成しています。 画面Aから遷移した時に生成したUITableViewに最初データを表示していて、データ更新時はサーバから通知がきた時に関数を呼ぶために生成しているインスタンスでUITableViewを更新しようとしていて、データwp更新できないと自分では考えています。 この場合はどうしたらよいでしょうか....?
TakeOne

2015/12/18 09:40

UITableViewを表示している画面は画面Bですか? 以下はそうだと仮定してコメントします。 サーバーから通知が来たときに画面Bのメソッドを 呼びたいのであれば、その画面Bのインスタンスが どこにあるかわかるようにして、サーバーから 通知をもらった時にそれを使って画面Bの既存の インスタンスを呼び出せばよいです。 コードが提示されてないので、これくらいの 抽象的なアドバイスできません。もっと具体的な アドバイスが欲しいなら、現状のコードを提示するか もっと具体的に詳しくテーブル表示やサーバーとの通信の 方法について説明してください。 現状の設計や使っているライブラリに応じて やり方はいろいろあると思います。
mm--_--mm

2015/12/18 09:56

ご回答いただきありがとうございます。 おっしゃる通り、UITableViewは画面Bで表示しようとしています。 生成したインスタンスをUserdefaultで保存してそれを使うといったイメージでしょうか?
TakeOne

2015/12/18 11:08

UserDefaultに保存する必要はありません。UserDefaultは、アプリを終了してもずっと覚えておきたい設定等を保存する時に使います。今回のデータはサーバーから得た情報をテーブルに表示したいだけだと思いますので、UserDefaultに保存するのは無駄です。 保存する場所は、プロパティとかパラメータとかブロック変数とかいろいろあります。どこに保存すればサーバーから通知が来た時に見つけやすいかは、現状の処理方式に応じて様々です。どんな処理をしているか具体的コードを示さずに質問されても、抽象的でピンとこない回答しかできません。
mm--_--mm

2015/12/21 09:39

返信が遅れてしまい、大変申し訳ありません... ソースコードを記載したいと思っているのですが、色々な方が書いているソースコードなのでまだ完璧に処理の流れを終えていない状況で(さらに自分はobjective-の初心者)どこを載せたら伝わりやすいかというのが判断しきれてませんので、なるべく早くソースを理解し記載していこうと思います。 その時はお時間がありましたら答えていただけると幸いです。 よろしくお願いいたします。
mm--_--mm

2015/12/24 07:02

無事に解決しました!インスタンスを生成するタイミング等の調整でなんとかなりました。 ありがとうございました!
guest

0

numberOfRowsInSection で0以外が返っていることはどのように確認していますか?

投稿2015/12/17 22:21

sekitaka_1214

総合スコア509

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

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

mm--_--mm

2015/12/17 23:41

すいません... 正確には確認していません... numberOfSectionsInTableViewでは、return 1;という風に記述しておりまして、 numberOfSectionsInTableViewの中でNSLog(@"test");と記述してLogが表示されたので1が返ってきてると思ってただけです...
mm--_--mm

2015/12/18 00:02

度々すいません。numberOfRowsInSectionの方でしたね。失礼いたしました。 numberOfRowsInSectionの方は返す値の中身をreturnの直前でNSLogで中身があるかどうか確認していて、中身があったので返ってきていると思ってたのですが...
guest

0

numberOfSectionsInTableView で0を返していることはないでしょうか。

投稿2015/12/17 09:53

sekitaka_1214

総合スコア509

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

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

mm--_--mm

2015/12/17 09:56

ご回答いただきありがとうございます。 そこは1を返しているのでもんだいないと思います…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問