删除按钮不会出现在 UITableViewCell 中

Posted

技术标签:

【中文标题】删除按钮不会出现在 UITableViewCell 中【英文标题】:Delete button doesn't appear in UITableViewCell 【发布时间】:2014-10-11 12:36:52 【问题描述】:

我在单击“编辑”时获得“删除”按钮时遇到问题。问题是它根本没有出现。我的代码在下面,它适用于在单元格上滑动...在此先感谢您的帮助!

#import "ViewController.h"

@interface ViewController ()

@property (strong) NSArray *lessons;

@end

static NSString *identifier = @"Cell";

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];

    self.lessons = @[
                     @"Computer Science",
                     @"Math",
                     @"Chemistry"
                     ];

    self.tableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain];
    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    [self.view addSubview:self.tableView];

    self.navigationItem.rightBarButtonItem = self.editButtonItem;

    [self.tableView registerClass:UITableViewCell.class forCellReuseIdentifier:identifier];


#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    return self.lessons.count;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    cell.textLabel.text = self.lessons[indexPath.row];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;


- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
    return YES;


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 



#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    [tableView deselectRowAtIndexPath:indexPath animated:YES];


- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
    return UITableViewCellEditingStyleDelete;


@end

一旦我按下编辑按钮。

当我在单元格上滑动时出现。

【问题讨论】:

如何创建编辑按钮? 感谢您的评论,我已经解决了这个问题! 【参考方案1】:

听到上面的代码,你会发现它真的很有用。

  - (HelloController *) init
    
        if (!(self = [super init])) return self;

        self.title = @"Table Edits";

        // Initialize the table titles, so they can be edited over time
        tableTitles = [[NSMutableArray alloc] init];
        ithTitle = NCELLS;
        for (int i = 1; i <= NCELLS; i++)
            [tableTitles addObject:[NSString stringWithFormat:@"Table Cell #%d", i]];

        return self;
    

    #pragma mark UITableViewDataSource Methods

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    
        return 1;
    

    - (NSInteger)tableView :(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    
        return [tableTitles count];
    

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"any-cell"];
        if (cell == nil) 
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"any-cell"] autorelease];
        

        cell.text = [tableTitles objectAtIndex:[indexPath row]];
        // cell.editingStyle = UITableViewCellEditingStyleDelete; // now read-only and no longer needed
        return cell;
    

    - (void) add
    
        [tableTitles addObject:[NSString stringWithFormat:@"Table Cell #%d", ++ithTitle]];
        [self.tableView reloadData];
    

    #pragma mark UITableViewDelegateMethods
    - (void) deselect
    
        [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
    

    // Respond to user selection
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)newIndexPath
    
        printf("User selected row %d\n", [newIndexPath row] + 1);
        [self performSelector:@selector(deselect) withObject:nil afterDelay:0.5f];
    

    -(void)leaveEditMode
    
        // Add the edit button
        self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]
                                                   initWithTitle:@"Edit"
                                                   style:UIBarButtonItemStylePlain
                                                   target:self
                                                   action:@selector(enterEditMode)] autorelease];
        [self.tableView endUpdates];
        [self.tableView setEditing:NO animated:YES];
    

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
    forRowAtIndexPath:(NSIndexPath *)indexPath
    
        printf("About to delete item %d\n", [indexPath row]);
        [tableTitles removeObjectAtIndex:[indexPath row]];
        [tableView reloadData];
    

    -(void)enterEditMode
    
        // Add the edit button
        self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]
                                                   initWithTitle:@"Done"
                                                   style:UIBarButtonItemStylePlain
                                                   target:self
                                                   action:@selector(leaveEditMode)] autorelease];
        [self.tableView setEditing:YES animated:YES];
    //  [self.tableView beginUpdates];
    

    - (void)loadView
    
        [super loadView];

        // Add an add button
        self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc]
                                                  initWithTitle:@"New"
                                                  style:UIBarButtonItemStylePlain
                                                  target:self
                                                  action:@selector(add)] autorelease];

        // Add the edit button
        self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]
                                                   initWithTitle:@"Edit" 
                                                   style:UIBarButtonItemStylePlain 
                                                   target:self 
                                                   action:@selector(enterEditMode)] autorelease];
    

【讨论】:

【参考方案2】:

如果有人遇到同样的问题,那么您可能在 UIViewController 中使用了 UITableView,因此它不会为您管理版本。点击Edit按钮时,必须手动实现TableView的编辑模式和View的编辑模式。我是如何解决这个问题的。

#pragma mark - Edit button listener 

- (void)editButtonPressed 
    if(self.editing) 
        [self setEditing:NO animated:YES];
        [self.tableView setEditing:NO animated:YES];
     else 
        [self setEditing:YES animated:YES];
        [self.tableView setEditing:YES animated:YES];
    

谢谢大家的评论!

【讨论】:

以上是关于删除按钮不会出现在 UITableViewCell 中的主要内容,如果未能解决你的问题,请参考以下文章

出现删除按钮时重新计算自定义 UITableViewCell 的高度

从 UITableViewCell 隐藏删除按钮

UIButton & UITextField 将阻止 UITableViewCell 被滑动删除

滑动删除 UITableViewCell 时,偶尔会出现红色减号删除图标

UITableViewCell 子类,在代码中绘制,动画中的删除按钮

以编程方式添加到 UITableViewCell 的 UIButtons 永远不会出现