1

私は以前に動作したことのあるコードを使用しています。基本的に、ユーザーはいくつかのボタンを使用して投稿に「はい」または「いいえ」と答えます。はいまたはいいえを押すと、正しく機能しているデータベースが更新され、機能していない表示されている UI も更新されます。この UI はボタンを更新して、一方が選択され、他方が強調表示され、両方がユーザー操作に対して無効になります。また、2 つの UILabels を変更します。これらのボタンが呼び出すメソッドは、データベースを更新し、tableViewCell からボタンを取得して変更を更新する必要があります。メソッドは別の ViewController で動作しているため、ここで違いを理解できません。これが私の cellForRowAtIndexPath です

- (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *simpleTableIdentifier = [NSString stringWithFormat:@"%ld,%ld",(long)indexPath.section,(long)indexPath.row];
NSLog(@" simple: %@",simpleTableIdentifier);
if (indexPath.row==0) {
    ProfileFirstCell *cell = [self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil)
    {
        cell = [[ProfileFirstCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:simpleTableIdentifier];
    }


    cell = [self createProfileCell:cell];
    return cell;

}else{
    YesNoCell *cell =[self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell==nil) {
        cell=[[YesNoCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }
    cell = [self createYesNoCell:cell:indexPath];
    return cell;

  }
}

基本的にこれが行うことは、最初のセルにユーザー プロファイルを作成し、ユーザーが尋ねるすべての質問を読み込むことです。これが、古い tableView とこの tableView の主な違いです。createYesNoCell で、UIElements を作成し、次のようにタグを作成します。

    cell.yesVoteButton.tag=indexPath.row+ yesVoteButtonTag1;
    cell.noVoteButton.tag=indexPath.row+ noVoteButtonTag1;
    cell.yesCountLabel.tag=indexPath.row+ yesCountLabelTag1;
    cell.noCountLabel.tag=indexPath.row+ noCountLabelTag1;

ボタンには、多くのことを開始するセレクターがあります。どのボタンが押されたかは以下でわかります。

     NSInteger index;
if(sender.tag>=yesVoteButtonTag1){
    NSLog(@"Yes button pressed");
    votedYes=true;
    index=sender.tag-yesVoteButtonTag1;

}else{
    NSLog(@"No button Pressed");
    votedYes=false;
    index=sender.tag-noVoteButtonTag1;
}

     UILabel *yesLabel = (UILabel*) [self.tableView   viewWithTag:index+yesCountLabelTag1]; // you get your label reference here
     UIButton *yesButton=(UIButton *)[self.tableView viewWithTag:index+1+yesVoteButtonTag1];
     NSLog(@"Tag IN METHOD: %ld",index+yesVoteButtonTag1);
     UILabel *noLabel = (UILabel*) [self.tableView viewWithTag:index+1+noCountLabelTag1]; // you get your label reference here
     UIButton *noButton=(UIButton *)[self.tableView viewWithTag:index+noVoteButtonTag1];

これらの viewWithTag 呼び出しは、私が見ると nil です。以前の実装との唯一の違いは、古い実装にはセクションと 1 つの行があったのに対し、これはすべての行と 1 つのセクションであるということです。そのため、indexPath.section を indexPath.row に置き換えることで、これを考慮する必要があります。また、cellForRowAtIndexPath で作成されたタグが、indexPath.row==0 でプロファイル セルが作成されているため、1 つずれているため、yes/no 投票メソッドで復元された行と同じであることを確認しました。セルを yes/no 投票メソッドに渡してみて、ボタンとラベルを contentView で回復しようとしましたが、同様の投稿でいくつかの提案がありました。しかし、これは私の問題を解決していないようです。これについての洞察を本当にいただければ幸いです。

4

3 に答える 3

0

「[tableView reload]」メソッドを呼び出して UITableView を更新すると、役立つ場合があります。

于 2016-10-13T02:33:07.870 に答える
0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    static NSString *CellIdentifier = @"YOURCELL_IDENTIFIER";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
   UILabel *title = (UILabel*) [cell viewWithTag:5];
   UILabel *vensu =(UILabel*) [cell viewWithTag:7];
   vensu.text = @"YOUR TEXT";

   title.text = @"YOUR TEXT";

   return cell;
}
于 2016-10-13T04:38:25.670 に答える
0

まず、テーブル再利用識別子は、セルごとに使用するのではなく、セルのタイプに使用する必要があります。2 つのタイプがあるため、2 つの固定再利用識別子を使用する必要があります。

ProfileFirstCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"ProfileCell"];

if (cell == nil) {
    cell = [[ProfileFirstCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:@"ProfileCell"];
}

YesNoCell *cell =[self.tableView dequeueReusableCellWithIdentifier:@"YesNoCell"];
if (cell==nil) {
    cell=[[YesNoCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"YesNoCell"];
}

次に、テーブルを作成した後にセルへの参照を取得しようとするのではなく、作成時にセルを完全に初期化する必要があります。(TableView は、セルが表示されていない限りセルを作成しないため、既存のセルにまったく依存しないでください。)

createProfileCellあなたはその中にセルを作成していないので、実際には と呼ばれるべきinitializeProfileCellです - あなたはすでに上の行でそれを行ったか、古いものを回復しました。

次に、への呼び出しinitializeProfileCellは、それがはいまたはいいえのセルであるかどうかを指定するフラグを取り、それに応じてそのプロパティを設定できます。

cell = [self initializeProfileCell:cell isYes:(indexPath.section==0)];

同様にcreateYesNoCell--> initializeYesNoCell.

于 2016-10-13T02:45:55.813 に答える