1

我正在使用一些我以前见过的代码。本质上,用户使用一些按钮在帖子上回答是或否。按“是”或“否”会更新正常工作的数据库,还会更新不工作的可见 UI。此 UI 更新按钮,以便选择一个按钮,另一个突出显示,并且两个按钮都被禁用以进行用户交互。它还对两个 UILabel 进行了更改。这些按钮调用的方法需要更新数据库并从 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 调用时,它们是零。从我之前的实现中我可以看到的唯一区别是旧的有部分和一排,而这个是所有行和一个部分。因此,用 indexPath.row 替换 indexPath.section 应该可以解决这个问题。我还检查了在 cellForRowAtIndexPath 中创建的标记是否与在 yes/no 投票方法中恢复的行相同,因为由于在 indexPath.row==0 处创建了配置文件单元格,所以它被替换了一个。我尝试将单元格传递给是/否投票方法,并尝试使用 contentView 恢复按钮和标签,就像在类似帖子中提出的一些建议一样。然而,这似乎并没有解决我的问题。真的很感激对此的一些见解。

4

3 回答 3

0

你有没有调用 '[tableView reload]' 方法来更新 UITableView,它可能会有所帮助。

于 2016-10-13T02:33:07.870 回答
0

首先,表重用标识符应该用于单元格类型,而不是每个单元格都使用一个。您有两种类型,因此您应该使用两个固定的重用标识符。

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 回答
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 回答