我正在实施滑动以删除uitableview中的功能。我能够实现这一点,但现在我希望显示一条警告消息以确认删除。我已经以编程方式创建了tableview。
@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
{
UITableView *tView;
NSMutableArray *myArray;
NSIndexPath *lastIndexPath;
}
@property(nonatomic,retain) UITableView *tView;
@property(nonatomic,retain) NSMutableArray *myArray;
@property(nonatomic,retain) NSIndexPath *lastIndexPath;
@end
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor=[UIColor lightGrayColor];
myArray = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10", nil];
// Do any additional setup after loading the view, typically from a nib.
tView = [[UITableView alloc] initWithFrame:CGRectMake(30, 30, 700, 800) style:UITableViewStylePlain];
tView.delegate=self;
tView.dataSource=self;
[self.view addSubview:tView];
[tView release];
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 100.0;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [myArray count];
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return YES if you want the specified item to be editable.
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Confirm Delete" message:@"Are you sure?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Delete", nil];
[alert show];
[alert release];
if (editingStyle == UITableViewCellEditingStyleDelete) {
lastIndexPath = indexPath;
NSLog(@"%@......%d",lastIndexPath,lastIndexPath.row);
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if(buttonIndex==0)
{
NSLog(@"cancel");
}
else {
NSLog(@"delete");
[myArray removeObjectAtIndex:lastIndexPath.row]; //memory error
[tView deleteRowsAtIndexPaths:[NSArray arrayWithObject:lastIndexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//..do required thing and return cell
}
我在clickButtonAtIndex方法中获取警报视图的内存错误。我认为它适用于lastIndexPath,但nslog()在lastIndexPath中给出了正确的值。 我做错了什么?
答案 0 :(得分:1)
我讨厌答案只是说“你不应该这样做”......所以我会解释你为什么会收到错误,然后希望你能更好地判断为什么你真的不应该这样做(从UI的角度来看)。
您收到错误是因为您直接将一个您不拥有的值(您没有保留它)分配给ivar。你可能想说self.lastIndexPath
。
警报视图直到下一次通过运行循环才真正出现,此时indexPath
已被自动释放并且您尝试通过指针访问它。
将lastIndexPath = indexPath;
更改为self.lastIndexPath = indexPath;
可解决内存问题。 (由于您将该属性标记为保留,假设您已将其合成并且未编写自己的处理程序,当您使用self.
前缀时,合成访问者将为您保留它。)
(顺便说一句,这就是为什么以不同于您的属性命名您的ivars并不是一个坏主意(例如Apple使用<property_name>_
,在我的网站上我使用m<Property_name>
这使得很难做出这种错误)。
好的......但回到你不应该这样做的原因....
此时,您的用户通过向左滑动做出了可识别的手势,然后按下了一个标有“删除”的红色按钮......现在您将弹出警报并要求他们确认?真?好的,如果你必须......