cell.textLabel.text在UITableView的每个部分重复

时间:2015-06-24 17:10:33

标签: ios objective-c uitableview

我在texLabel确定了UITableViewCell cellForRowAtIndexPath的设置方式,问题是当从agendaTableArray拉出时,它会重复表格的每个部分中的项目,而不是仅在其所属的部分中。换句话说,我希望数组中的每个项目都在其自己的部分中。

以下是目前的情况:

enter image description here

以下是我设置cellForRowAtIndexPath的方式:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MyIdentifier = @"MyReuseIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:MyIdentifier];
        cell.textLabel.text = nil;
    }

    self.agendaTableArray = @[@"Dinner with Rebekah", @"Soccer game", @"Denist appt.", @"Celebrate job offer, drinks with Pierre!", @"No events today!"];

    // Set title of the event
    if (self.datePicked == [NSNumber numberWithInt:16]) {
        NSLog(@"cellForRowAtIndexPath says self.datePicked is 16");
    }
    else if (self.datePicked == [NSNumber numberWithInt:17]) {
        NSLog(@"cellForRowAtIndexPath says self.datePicked is 17");
    }
    else if (self.datePicked == [NSNumber numberWithInt:18]) {
        NSLog(@"cellForRowAtIndexPath says self.datePicked is 18");
    }
    else if (self.datePicked == [NSNumber numberWithInt:19]) {
        NSLog(@"cellForRowAtIndexPath says self.datePicked is 19");
    }
    else {

    }

    cell.textLabel.text = self.agendaTableArray[indexPath.row];
    cell.textLabel.font = [UIFont systemFontOfSize:14];

    [self whatSectionsAreVisible];

    return cell;
}

如何将其设置为仅在第一部分的单元格中加载agendaTableArray的项目?

4 个答案:

答案 0 :(得分:3)

首先,你应该使用它:

- dequeueReusableCellWithIdentifier:forIndexPath:

而不是

- dequeueReusableCellWithIdentifier

即使不是绝对必要,here也很好地解释了为什么要这样做。

其次,每次请求绘制一个单元格时,您都要分配一个新数组,如果由于任何原因您决定更改某个元素,它将不起作用,此行应该在您的{{1}中提高绩效:

viewDidLoad

第三,你永远不应该将NSNumber值与self.agendaTableArray = @[@"Dinner with Rebekah", @"Soccer game", @"Denist appt.", @"Celebrate job offer, drinks with Pierre!", @"No events today!"]; 进行比较,两个NSNumber只有当它们实际上是同一个对象而不是它的实际值时才会完全相同(==),比较你需要使用两个NSNumber isEqualToNumber:

==

最后为每个部分设置一个不同的元素:

// Assuming datePicked is a NSNumber
([self.datePicked isEqualsToNumber:[NSNumber numberWithInt:16]])

答案 1 :(得分:0)

你正在重复使用单元格,就在

之后
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("SOAPAction", Arrays.asList("myPrefix:mySoapMethod"));
proxy.getRequestContext().put(Message.PROTOCOL_HEADERS, headers);

设置

if (!cell)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:MyIdentifier];
}

答案 2 :(得分:0)

您可以使用以下方法检查cellForRowAtIndexPath所在的部分:

if(indexPath.section==0){ 
//Logic for section 0
}else if(indePath.section==1){
//Logic for section 1
}

其中如果您想要第一部分的第一行,则可以执行此操作:

if(indexPath.section==0 && indexPath.row==0){ 
   //Code here
}

我希望有所帮助。当然不是&amp;&amp;你可以在第一个内部嵌入indexPath.row == 0 if if like:

if(indexPath.section==0){ 
  if(indexPath.row==0){
    //Code here
  }
}

答案 3 :(得分:0)

首先 将includes设置在其他位置,例如agendaTableArrayinitviewDidLoad

我也猜测你有viewWillAppear这样的东西

numberOfSectionsInTableView:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return N; // the number of sections you want to display }

numberOfRowsInSection:

然后你可能想要比较这些数字可能就像这样

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.agendaTableArray.count;
}

在这种情况下,我建议使用if ([self.datePicked intValue] == 16) { NSLog(@"cellForRowAtIndexPath says self.datePicked is 16"); } 条件

使用switch

建议的OR

最后选择这一行

isEqualsToNumber:

超出if条件

我的建议

您可能想要创建自定义cell.textLabel.text = nil; 并使用默认单元格样式UITableViewCell对其进行初始化,然后覆盖单元格UITableViewCellStyleSubtitle以重置可重复使用单元格的内容。

然后在prepareForReuse中你可以注册,你可以处理if条件viewDidLoad这样你的代码看起来更模块化和更清洁