以下是我的一些工作代码,它在待办事项完成时为其添加了一个复选标记:
- (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
更改为NSAttributedString
和NSMutableAttributedString
根据我已经看过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支持。
如果项目完成,我怎样才能在表格单元格标签上获得删除线效果?
答案 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;