我想在点击编辑按钮或滑动UITableViewCell
行时更改减号按钮的颜色并删除UITableView
的按钮。到目前为止,我已经实现了这段代码:
-(IBAction)doEdit:(id)sender
{
[[self keyWordsTable] setEditing:YES animated:NO];
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
}
答案 0 :(得分:97)
iOS 8和9 (props to this post)
注意:如果您正在使用现有的iOS 7项目,则需要将目标更新到iOS 8才能获得此功能。还记得设置UITableviewDelegate。
所有的魔法现在都在这里发生(你想要的按钮也很多!!!!):
-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewRowAction *button = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 1" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
{
NSLog(@"Action to perform with Button 1");
}];
button.backgroundColor = [UIColor greenColor]; //arbitrary color
UITableViewRowAction *button2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 2" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
{
NSLog(@"Action to perform with Button2!");
}];
button2.backgroundColor = [UIColor blueColor]; //arbitrary color
return @[button, button2];
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
// you need to implement this method too or nothing will work:
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
(iOS 7)
**activate the delete button on swipe**
// make sure you have the following methods in the 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时才会调用备用颜色,因此我们通过重新加载所有内容来确保这种情况发生。)
答案 1 :(得分:23)
UITableViewDelegate docs( editActionsForRowAtIndexPath 方法)
返回值
表示操作的UITableViewRowAction对象数组 排。您提供的每个操作都用于创建一个按钮 用户可以点按。
<强>讨论强>
如果要为其提供自定义操作,请使用此方法 你的一个表行。当用户水平滑动时, 表视图将行内容移到一边以显示您的操作。 点击其中一个操作按钮会执行存储的处理程序块 与行动对象。
如果未实现此方法,则表视图将显示 用户滑动行时的标准附件按钮。
Swift中的工作示例:
@available(iOS 8.0, *)
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
let button1 = UITableViewRowAction(style: .Default, title: "Happy!") { action, indexPath in
print("button1 pressed!")
}
button1.backgroundColor = UIColor.blueColor()
let button2 = UITableViewRowAction(style: .Default, title: "Exuberant!") { action, indexPath in
print("button2 pressed!")
}
button2.backgroundColor = UIColor.redColor()
return [button1, button2]
}
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
}
答案 2 :(得分:3)
第一次在.m(自定义单元格)中调用willTransitionTo状态
- (void)willTransitionToState:(UITableViewCellStateMask)state{
NSLog(@"EventTableCell willTransitionToState");
[super willTransitionToState:state];
[self overrideConfirmationButtonColor];
}
检查iOS版本,它在这里,我使用的是iOS 7 - iOS8
//at least iOS 8 code here
- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
// iOS 8+ code here
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;
}
}
else{
// Pre iOS 8 code here
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)
{
UIColor *color = UIColorFromRGB(0xFF7373);
confirmationButton.backgroundColor = color;
}
});
}
答案 3 :(得分:2)
无法使用公共API。
对于删除按钮,您可以使用自定义实现(例如SWTableViewCell)来更改按钮的颜色,以及添加其他按钮。
答案 4 :(得分:1)
旧问题,但我确定有些人支持iOS 7。 要更改删除按钮背景颜色,您需要创建“UITableViewCell”类或扩展它。 然后你可以使用
transform: scale(0.5)