目前我正在尝试在UITableViewCell中自定义delte按钮。
现在我有类似的东西:
现在,我需要的是改变这个按钮的颜色,我不想改变行为,或者让它完全自定义。我确信这是可能的,没有创建自己的控件来删除UITableView中的行。
这是我的代码:
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *subview in self.subviews) {
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
deleteButtonView.backgroundColor = [UIColor greenColor];
}
}
}
我该怎么做?
提前致谢!
答案 0 :(得分:5)
UITableViewCellDeleteConfirmationControl不是公共类,您无法轻易更改其外观。
为此,我相信您必须遍历单元格的子视图并更改其属性:
for (UIView *subview in self.subviews) {
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl") {
// Set the background using an image.
}
}
当然,你应该警惕做这种事情,因为它相当脆弱。我建议改为自己。
我建议Apple submitting a bug report要求能够更轻松地编辑它。
答案 1 :(得分:4)
在UITableViewCell子类中:
- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
for(UIView *subview in view.subviews) {
if([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) return subview;
UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
if(recursiveResult) return recursiveResult;
}
return nil;
}
-(void)overrideConfirmationButtonColor
{
dispatch_async(dispatch_get_main_queue(), ^{
UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
if(confirmationButton) confirmationButton.backgroundColor = [UIColor orangeColor];
});
}
然后在UITableViewDelegate:
-(void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
<#Your cell class#> *cell = (<#Your cell class#>*)[self.tableView cellForRowAtIndexPath:indexPath];
[cell overrideConfirmationButtonColor];
}
这适用于iOS 7.1.2
答案 2 :(得分:2)
以下是如何:
在滑动时激活删除按钮
//确保你在uitableviewcontroller中有以下方法
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"You hit the delete button.");
}
设置自定义文字标签而非删除。
-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
return @"Your Label";
}
为按钮第1部分设置自定义颜色 - 警告,这在技术上涉及戳私人苹果API。但是,您不能使用属于UIKIT的公共方法搜索来修改子视图。
创建一个uitableviewcell类(另请参阅https://stackoverflow.com/a/22350817/1758337)
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *subview in self.subviews) {
//iterate through subviews until you find the right one...
for(UIView *subview2 in subview.subviews){
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) {
//your color
((UIView*)[subview2.subviews firstObject]).backgroundColor=[UIColor blueColor];
}
}
}
}
另一个注意事项:无法保证此方法在将来的更新中有效。还要注意提及或使用私有UITableViewCellDeleteConfirmationView
类可能导致AppStore拒绝。
为按钮第2部分设置自定义颜色
回到你的uitableviewcontroller
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
[YourTableView reloadData];
}
(替换颜色不会被调用,直到下次在tablecell上调用layoutSubviews,因此我们通过重新加载所有内容来确保这种情况发生。)
答案 3 :(得分:2)
silyevsk的例子很棒......但是,六个月之后,iOS 8已经出现了,它已经不再适用了。
现在,您需要查找名为“_UITableViewCellActionButton
”的子视图并设置其背景颜色。
以下是我在我的应用中使用的silyevsk代码的修改版本。
在我的UITableView
个单元格的某些上,我不希望用户能够滑动删除,但我 想要某些东西(一个挂锁图标)在他们滑动时出现。
为此,我在我的UITableViewCell类
中添加了一个bReadOnly
变量
@interface NoteTableViewCell : UITableViewCell
. . .
@property (nonatomic) bool bReadOnly;
-(void)overrideConfirmationButtonColor;
@end
我将silyevsk的代码添加到我的.m文件中:
- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
for(UIView *subview in view.subviews) {
if([NSStringFromClass([subview class]) rangeOfString:@"UITableViewCellActionButton"].location != NSNotFound)
return subview;
UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
if(recursiveResult)
return recursiveResult;
}
return nil;
}
-(void)overrideConfirmationButtonColor
{
if (!bReadOnly)
return;
dispatch_async(dispatch_get_main_queue(), ^{
UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
if(confirmationButton)
{
confirmationButton.backgroundColor = [UIColor lightGrayColor];
UIImageView* imgPadLock = [[UIImageView alloc] initWithFrame:confirmationButton.frame];
imgPadLock.image = [UIImage imageNamed:@"icnPadlockBlack.png"];
imgPadLock.contentMode = UIViewContentModeCenter; // Don't stretch the UIImage in our UIImageView
// Add this new UIImageView in the UIView which contains our Delete button
UIView* parent = [confirmationButton superview];
[parent addSubview:imgPadLock];
}
});
}
另外,我需要更改填充UITableView
的代码,否则会出现“删除”标签以及挂锁图标:
-(NSString*)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
Note* note = [listOfNotes objectAtIndex:indexPath.row];
if ( /* Is the user is allowed to delete this cell..? */ )
return @"Delete";
return @" ";
}
它仍然很难看,并且依赖于假设,当iOS 9出现时,这并不会全部改变。
答案 4 :(得分:1)
这是解决方案:
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *subview in self.subviews) {
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Background"]];
[deleteButtonView addSubview:image];
}
}
}
答案 5 :(得分:1)
IOS7兼容的答案(不是创建自定义类,而是扩展UITableViewCell:
@implementation UITableViewCell (customdelete)
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *subview in self.subviews) {
for(UIView *subview2 in subview.subviews){
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) {
((UIView*)[subview2.subviews firstObject]).backgroundColor=COLOR_RED;
//YOU FOUND THE VIEW, DO WHATEVER YOU WANT, I JUST RECOLOURED IT
}
}
}
}
@end