我有自定义单元格的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];
答案 0 :(得分:1)
我使用这种方法删除单元格 -
- (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
的原型单元格如下:
并且您已将标签连接到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中定义的块,代码将从数据数组中删除该行的元素,并重新加载表视图。