问题定制UITableViewCell

时间:2012-04-03 04:00:13

标签: objective-c uitableview uilabel

我正在使用以下代码在我的单元格上创建一个UILabel。 (我知道这个例子是人为的;我甚至无法让这个工作更少地达到我的最终设计目标。)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    static NSString *CellIdentifier = @"Photo";

    UILabel *username;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

        username = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 120.0, 20.0)];
        username.tag = USERNAME_TAG;
        username.font = [UIFont systemFontOfSize:14.0];
        username.textAlignment = UITextAlignmentLeft;
        username.textColor = [UIColor blackColor];
        username.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview:username];
    } else {
        username = (UILabel *)[cell.contentView viewWithTag:USERNAME_TAG];
    }

    //NSDictionary *photos = [self.photos objectAtIndex:indexPath.row];
    username.text = @"Testing!";

    return cell;
}

我从here

获得了此模板代码

但是,当我运行代码时,单元格中没有文本标签,但附件确实出现了。

3 个答案:

答案 0 :(得分:1)

我发现使用自定义xib更容易用于表格单元格,这些表格单元格不容易适用于其中一种常规类型。基本步骤是:使用您的行创建一个xib,创建一个outlet属性,然后在您的cellForRowAtIndexPath方法中,调用loadNibNamed并将其分配给一个局部变量(您返回),并将该出口设置为nil。

秘密在于,使用零出口装入笔尖会导致零出口被初始化并用笔尖的内容充气。

此处描述(滚动到从Nib文件加载自定义表格 - 查看单元格): http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7

如果您需要大量的用户交互,那么最好不要对UITableViewCell进行子类化并为其提供自己的xib。如果你在一个单元格上有很多控件,你最终会使用标签来确定事件的来源,这些事件会因多个标签而变得混乱。

答案 1 :(得分:0)

您似乎只是想在UILabel添加“标准”UITableViewCell

以下是您的操作:UITableViewCell的每个UITableViewCellStyleDefault都有一个名为textLabel的属性。在您的代码中,执行以下操作:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    static NSString *CellIdentifier = @"Photo";

    UILabel *username;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
    }
    cell.textLabel.text = @"Testing!";

    return cell;
}

PS:看起来你正试图在某个时候添加图片?这也是一个属性。请查看imageView属性的documentation

答案 2 :(得分:0)

Apple在发布5.0时改变了dequeueReusableCellWithIdentifier的行为。

在5.0+中,保证始终返回您的单元格的副本(如果它存在于您的xib / storyboard中),即使您还没有加载单元格。在此之前,如果有一个单元已经准备好被回收,它将返回一个单元

因此,一些旧的代码假定你将收到零,除非你已经初始化它将会中断。

因此,删除xib / storyboard中的标识符(或整个单元格)或修改逻辑,以便在需要时初始化它(可能基于是否存在具有指定标记的视图)。 / p>