从自定义单元格UITableView中删除行

时间:2018-03-05 16:39:28

标签: ios objective-c uitableview nsuserdefaults

我有自定义单元格的tableview。我想在自定义单元格中创建一个按钮,当我单击它时,它会删除该行并使用新数组刷新主视图。当视图从userDefaults加载时获取数组,如下所示存储。如果我注释掉删除行行,则以下代码有效,但它将使用旧数组信息刷新,并且不会获取新数组。我已经尝试了一切,当前的代码给了我以下错误:

  

- [TableViewCellSchedule section]:无法识别的选择器发送到实例0x7ffd65092800

任何想法都表示赞赏。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:favid forKey:@"favid"];
[userDefaults synchronize];
TableViewCellSchedule *cell = (TableViewCellSchedule *)[[self.fullfav superview] superview];
UITableView *table = cell.superview;
[table reloadData];
[table deleteRowsAtIndexPaths:[NSArray arrayWithObject:cell]
                         withRowAnimation:UITableViewRowAnimationFade];

3 个答案:

答案 0 :(得分:1)

我使用这种方法删除单元格 -

  • 首先获取表格视图添加单元格并在此处添加一个按钮。
  • 在单元格类中创建一个按钮的IBOutlet。
  • 在视图控制器类中创建一个IBAction,其中存在表视图数据源和委托方法。
  • 内部tableview方法(cellForRowAtIndexPath)为此按钮提供标记值。即行号
  • 单击单元格按钮时,您将在按钮的IBAction中获取其标记值。
  • 然后您可以通过从数组中删除此索引来删除行。
  • 然后重新加载数据。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        ContactTableViewCell *cell            = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
 // your initialization -----------
        cell.btnFriend.tag                = indexPath.row;
        return cell;
 }

// this button is present on cell. By tag value of button we can get cell index which is selected, because tag value and array index is same
- (IBAction)tapOnUnfriend:(id)sender
{
    UIButton *btn = (UIButton *) sender;
    NSString *strSelectedTitle = [arrMyFriendList objectAtIndex :btn.tag];
   [arrMyFriendList removeObjectAtIndex:btn.tag];
   [self.tableViewContactList reloadData];

 // or if you  want cell of tableview you can get by tag value
 // NSIndexPath *indexPath = [NSIndexPath indexPathForRow:btn.tag inSection:0];
// YourCell *cell = (YourCell *)[tblRegister cellForRowAtIndexPath:indexPath];

}

答案 1 :(得分:0)

首先,是一个很好的做法,让cell[[self.fullfav superview] superview];很有可能你最终得到的不是一个单元格。而是使用tableview数据源/委托方法和数据源数组来保持tableview同步。

由于此行[table deleteRowsAtIndexPaths:[NSArray arrayWithObject:cell]withRowAnimation:UITableViewRowAnimationFade];,您的代码崩溃了

这是因为deleteRowsAtIndexPaths方法接受NSIndexPath个对象的数组,但是你传入的是TableViewCellSchedule个对象的数组。因此,您需要传递给该方法的数组应该是这样的 - [NSArray arrayWithObject:[table indexPathForCell:cell]]。如果您使用reloadData

,也请删除deleteRowsAtIndexPaths方法

答案 2 :(得分:0)

这是一个非常简单的例子。假设你有一个UITableViewController的原型单元格如下:

enter image description here

并且您已将标签连接到IBOutlet,并且连接到IBAction的按钮上的Touch Up Inside ...

Cell.h

//
//  RemoveRowTableViewCell.h
//
//  Created by Don Mag on 3/5/18.
//

#import <UIKit/UIKit.h>

@interface RemoveRowTableViewCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *theLabel;

- (void)setDidTapDeleteButtonBlock:(void (^)(id sender))didTapDeleteButtonBlock;

@end

Cell.m

//
//  RemoveRowTableViewCell.m
//
//  Created by Don Mag on 3/5/18.
//

#import "RemoveRowTableViewCell.h"

@interface  RemoveRowTableViewCell ()

@property (copy, nonatomic) void (^didTapDeleteButtonBlock)(id sender);

@end

@implementation RemoveRowTableViewCell

- (IBAction)doDidTapDeleteButton:(id)sender {
    // call back to tell the table view controller that the button was tapped
    if (self.didTapDeleteButtonBlock) {
        self.didTapDeleteButtonBlock(sender);
    }
}

@end

TableViewController.h

//
//  RemoveRowTableViewController.h
//
//  Created by Don Mag on 3/5/18.
//

#import <UIKit/UIKit.h>

@interface RemoveRowTableViewController : UITableViewController

@end

TableViewController.m

//
//  RemoveRowTableViewController.m
//
//  Created by Don Mag on 3/5/18.
//

#import "RemoveRowTableViewController.h"
#import "RemoveRowTableViewCell.h"

@interface RemoveRowTableViewController ()
@property (strong, nonatomic) NSMutableArray *theDataArray;
@end

@implementation RemoveRowTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // initialize the data array
    self.theDataArray = [@[@"A", @"B", @"C", @"D", @"E", @"F", @"G"] mutableCopy];

}

#pragma mark - Table view data source

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return _theDataArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    RemoveRowTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"removeCell" forIndexPath:indexPath];

    // Configure the cell...
    cell.theLabel.text = _theDataArray[indexPath.row];

    [cell setDidTapDeleteButtonBlock:^(id sender) {
        // button in cell was tapped, so remove that item from the data array
        [self.theDataArray removeObjectAtIndex:indexPath.row];
        // and reload the tableView
        [self.tableView reloadData];
    }];

    return cell;
}

@end

现在,当您点击单元格中的按钮时,它将会回拨&#34;到tableViewController中定义的块,代码将从数据数组中删除该行的元素,并重新加载表视图。