目标C - 完成后表格标签上的删除线

时间:2014-04-15 19:34:58

标签: ios objective-c nsstring nsattributedstring strikethrough

以下是我的一些工作代码,它在待办事项完成时为其添加了一个复选标记:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"ListPrototypeCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    XYZToDoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row];
    cell.textLabel.text = toDoItem.itemName;
    if (toDoItem.completed) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;

    } else {
         cell.accessoryType = UITableViewCellAccessoryNone;
    }    return cell;
}

我想要做的是删除复选标记代码和类似的东西(基本逻辑):

    if (toDoItem.completed) {
        cellIdentifier.textLabel (NSAttributedString Strikethrough = YES)

    } else {
         cellIdentifier.textLabel (NSAttributedString Strikethrough = NO)
    }    return cell;

我还尝试将NSString更改为NSAttributedStringNSMutableAttributedString根据我已经看过such as this one这样的其他一些问题和答案:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary* attributes = @{
                             NSStrikethroughStyleAttributeName: [NSNumber numberWithInt:NSUnderlineStyleSingle]
                             };
    static NSAttributedString* cellIdentifier = [[NSAttributedString alloc] initWithString:@"ListPrototypeCell" attributes:attributes];
    cell.textLabel.attributedText = cellIdentifier;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    XYZToDoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row];
    cell.textLabel.text = toDoItem.itemName;
    if (toDoItem.completed) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;


    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }    return cell;
}

但我不确定具体的实现方式,例如如何在if (toDoItem.completed)方法上调用它。这只需要iOS7支持。

如果项目完成,我怎样才能在表格单元格标签上获得删除线效果?

2 个答案:

答案 0 :(得分:6)

您使用的代码有几个问题。崩溃是将属性字符串设置为单元格标识符的结果。从那里开始,在尝试为其属性赋值之前,应该将单元格出列。您还应该从toDoItems数组中的对象初始化属性字符串。总的来说,我认为这就是你的意思:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"ListPrototypeCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];


    XYZToDoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row];

    if (toDoItem.completed) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;

        NSDictionary* attributes = @{NSStrikethroughStyleAttributeName: [NSNumber numberWithInt:NSUnderlineStyleSingle]};
        NSAttributedString* attributedString = [[NSAttributedString alloc] initWithString:toDoItem.itemName attributes:attributes];

        cell.textLabel.attributedText = attributedString;

    } else {
        cell.textLabel.text = toDoItem.itemName;
        cell.accessoryType = UITableViewCellAccessoryNone;
    } 

    return cell;
}

答案 1 :(得分:1)

cellIdentifier.textLabel (NSAttributedString Strikethrough = NO)

如果您真的想要这样做,请将“cellIdentifier”更改为“cell”,并使用方法“setAttributedText”设置NSAttributedString。单元格标识符只是用于出列和重用单元格的标识符字符串。您需要在UITableViewCell上设置文本:

NSAttributedString *attributedString; 
//Format your string
[cell.textLabel setAttributedText:attributedString];

编辑:

在你添加的代码中,很多东西都是错误的。首先,术语“单元标识符”通常用于描述出列或创建单元格时要放置的文本

NSString *cellIdentifier = @"ListPrototypeCell";
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

第二,如果您没有使用storyboard或xibs,则不会自动创建单元格。添加:

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

在代码中,在分配单元格之前设置属性字符串,然后设置文本。您需要在创建单元格后设置属性文本,并在“text”或“attributedText”之一中进行选择

NSString *cellIdentifier = @"ListPrototypeCell";
    NSDictionary* attributes = @{
                                 NSStrikethroughStyleAttributeName: [NSNumber numberWithInt:NSUnderlineStyleSingle]
                                 };

    NSAttributedString* attributedText = [[NSAttributedString alloc] initWithString: @"The striked text" attributes:attributes];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    XYZToDoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row];

    if (toDoItem.completed) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        cell.textLabel.text = nil;
        cell.textLabel.attributedText = attributedText;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.textLabel.text = toDoItem.itemName;
        cell.textLabel.attributedText = nil;
    }
    return cell;