質問編集履歴

2 ソースコードを追記しました。

hirahasu

hirahasu score 110

2015/12/11 15:45  投稿

UITableViewのcellForRowAtIndexPathが2回目から呼ばれない
いつもお世話になっております。
表題の件ですが、一回UITableViewをviewdidlaod内で生成し、値を表示した後に別の関数でもう一度cellに表示する値を取得しなおして一回目に生成したUITableViewを削除し、もう一回UITableViewを生成したいのですが、2回目以降からUITableViewを作成しようとしてもcellForRowAtIndexPathが呼ばれず、作成することができません...
調べてみると、numberOfRowsInSectionの値は0になっているとcellForRowAtIndexPathが呼ばれないとネットに書いてありましたが、NSLogで確認してみたところ、0にはなっていませんでした。
この原因がわかる方おりましたら教えていただけると幸いです。
以上です。
よろしくお願いいたします。
*追記
下記がUITableViewを更新しようとしていコードになります。
下記がUITableViewを更新しようとしているコードになります。
```objective-c
hoge.hの中
NSMutableDictionary *m_UserListDict;
@property (retain, nonatomic)NSMutableArray *hoge;
NSString *UserCnt;
NSString *str;
NSMutableArray *val;
hoge.mの中
int iUserCnt;
CGRect listView_windowsize;  
float listView_height_windowsize;  
float listView_width_windowsize;  
 
- (void)viewDidLoad { //tableviewの生成  
 
   listView_windowsize = [[UIScreen mainScreen] bounds];  
   listView_height_windowsize = listView_windowsize.size.height;  
   listView_width_windowsize = listView_windowsize.size.width;  
     
   listtable = [[UITableView alloc] initWithFrame:[self.view bounds]];  
   listtable.frame = CGRectMake(0, 44 , listView_width_windowsize, listView_height_windowsize * 0.8);  
   listtable.delegate = self;  
   listtable.dataSource = self;  
   listtable.allowsMultipleSelection = YES;  
   [self.view addSubview:listtable];  
 
}  
 
- (void)OnEnterMember:(const char*)strUserId { //サーバーから通知を受け取る関数(ここも都合上、割愛させてもらってます)  
   
  [self performSelectorOnMainThread:@selector(DisplayList) withObject:nil waitUntilDone:YES];  
 
}  
 
-(void)get_data{ //サーバーからxml形式でデータを取得し、格納する。(サーバと通信してる部分等は省略してます)  
 
m_UserListDict = [[NSMutableDictionary alloc]init];  
       [m_UserListDict setDictionary:UserList];  
       for (id key in m_UserListDict){  
           NSLog(@"%@,%@", key, m_UserListDict[key]);  
       }  
}  
 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  //セクションの数を返す  
{  
   // Return the number of sections.  
   return 1;  
}  
 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section   //cellの数を返す  
{  
     
    return self.hoge.count;  
     
 
}  
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
   UITableViewCell *cell;  
     
   static NSString *CellIdentifier = @"Cell";  
   cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
     
   if (cell == nil) {  
   
       cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];  
       cell.selectionStyle = UITableViewCellSelectionStyleNone;  
 
   }  
   cell.textLabel.text = [self.hoge objectAtIndex:indexPath.row];  
     
   return cell;  
   
}  
-(void)DisplayList{
 
   
   [self get_data];
   NSLog(@"isMainThread=%@", NSThread.currentThread.isMainThread?@"YES":@"NO");
   str = [[NSString alloc]init];
   val = [[NSMutableArray alloc]init];
   self.hoge = [[NSMutableArray alloc]init];
   
   UserCnt = [m_UserListDict objectForKey:@"UserCnt"]; 
    iUserCnt     = [UserCnt intValue]; 
   self.userlistarray = [[NSMutableArray alloc]init];
   UserCnt = [m_UserListDict objectForKey:@"UserCnt"];
   iUserCnt     = [UserCnt intValue];
   
   for ( int i = 0; i < iUserCnt; i++){
       
     
       str = [NSString stringWithFormat:@"%d", i];
       val = [[m_UserListDict objectForKey:str] objectForKey:@"name"];
       [self.hoge addObject:val];
       
 
   }
    NSLog(@"reloadDataの直前のlisttable=%@", listtable);
 
       [listtable reloadData];
   }
 
   NSLog(@"reloadDataの直後のlisttable=%@", listtable);
   userlistcnt = (int)[self.userlistarray count];
}
```
処理の流れとしてはm_UserListDictの中にあるnameというkeyで保存されている値をvalに入れてそれを
self.hogeに入れて最後に[listtable reloadData];を行っている処理になります。
m_UserListDictの中身が空とかいう問題はありませんでした。
よろしくお願いいたします。
  • Objective-C

    1350 questions

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

  • iOS

    6079 questions

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

1 ソースコードの追記をしました。

hirahasu

hirahasu score 110

2015/12/10 09:41  投稿

UITableViewのcellForRowAtIndexPathが2回目から呼ばれない
いつもお世話になっております。
表題の件ですが、一回UITableViewをviewdidlaod内で生成し、値を表示した後に別の関数でもう一度cellに表示する値を取得しなおして一回目に生成したUITableViewを削除し、もう一回UITableViewを生成したいのですが、2回目以降からUITableViewを作成しようとしてもcellForRowAtIndexPathが呼ばれず、作成することができません...
調べてみると、numberOfRowsInSectionの値は0になっているとcellForRowAtIndexPathが呼ばれないとネットに書いてありましたが、NSLogで確認してみたところ、0にはなっていませんでした。
この原因がわかる方おりましたら教えていただけると幸いです。
以上です。
よろしくお願いいたします。
よろしくお願いいたします。
*追記
下記がUITableViewを更新しようとしていコードになります。
```objective-c
hoge.hの中
NSMutableDictionary *m_UserListDict;
@property (retain, nonatomic)NSMutableArray *hoge;
NSString *UserCnt;
NSString *str;
NSMutableArray *val;
hoge.mの中
int iUserCnt;
-(void)DisplayList{
 
   str = [[NSString alloc]init];
   val = [[NSMutableArray alloc]init];
   self.hoge = [[NSMutableArray alloc]init];
   
   UserCnt = [m_UserListDict objectForKey:@"UserCnt"];  
    iUserCnt     = [UserCnt intValue];   
   
   for ( int i = 0; i < iUserCnt; i++){
       
       str = [NSString stringWithFormat:@"%d", i];
       val = [[m_UserListDict objectForKey:str] objectForKey:@"name"];
       [self.hoge addObject:val];
       
 
       [listtable reloadData];
   }
```
処理の流れとしてはm_UserListDictの中にあるnameというkeyで保存されている値をvalに入れてそれを
self.hogeに入れて最後に[listtable reloadData];を行っている処理になります。
m_UserListDictの中身が空とかいう問題はありませんでした。
よろしくお願いいたします。
  • Objective-C

    1350 questions

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

  • iOS

    6079 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る