从UILongPressGestureRecognizer上的tableview单元格保存数据

时间:2012-01-12 07:10:51

标签: iphone objective-c ios

我希望在UILongPressGestureRecognizer事件中获取并保存来自单元格的数据。我正在尝试的是,当用户点击并按住很长时间后,将打开一个对话框(将有3个或更多按钮),用户可以选择保存特定的单元格数据,或从表格中删除该单元格或者去另一个屏幕。

以下是我为此目的使用的代码:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";  

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    UILongPressGestureRecognizer *pressRecongnizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(tableCellPressed:)];
    pressRecongnizer.minimumPressDuration = 0.5f;
    [cell addGestureRecognizer:pressRecongnizer];
    [pressRecongnizer release];
}

if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]){
    cell.textLabel.text = 
    [self.filteredListItems objectAtIndex:indexPath.row];
}
else{
    cell.textLabel.text =
    [self.groups objectAtIndex:indexPath.row];
}

return cell;}

- (void)tableCellPressed:(UILongPressGestureRecognizer *)recognizer{

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add to Favourites", @"Take to Map", @"Delete" ,nil] ;
[alert show];}

在这里,我想知道如何将数据保存到coreData?

1 个答案:

答案 0 :(得分:2)

UIGestureRecognizer有一个view属性,表示它所附加的视图。

UITableViewCell *cell = (UITableViewCell *)[recognizer view];
NSString *text = cell.textLabel.text;

由于您在每个单元格上放置了手势识别器,因此您可以轻松使用上述代码来抓取特定单元格。

请注意,您必须实施UIAlertDelegate方法并暂时将数据保存在某个地方,因为用户选择的任何选项都会在单独的方法中反映出来。

编辑:

由于用户在UIAlertView中的选择是以不同的方法给出的,因此您必须保存对单元格的引用(无论您是创建indexPath的实例变量,单元格等等......都取决于您)

- (void)tableCellPressed:(UILongPressGestureRecognizer *)recognizer {
     UITableViewCell *cell = (UITableViewCell *)[recognizer view];

     self.myText = cell.textLabel.text;
     self.currentCellIndexPath = [self.tableView indexPathForCell:cell];

     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add to Favourites", @"Take to Map", @"Delete" ,nil] ;
     [alert show];
 }

要删除单元格,首先需要从数据源中删除它。到目前为止,您处于委托方法中:

if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:@"Delete"]) {
    [myArray removeObjectAtIndex:self.currentCellIndexPath]; // in this example, I saved the reference to the cell using a property

    // last line of example code
}

现在您需要以两种方式之一更新表格视图。您可以通过调用:

立即刷新表格视图
[self.tableView reloadData];

或者,如果你想要漂亮的删除动画表视图,你可以使用:

[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:self.currentCellIndexPath] withRowAnimation:UITableViewRowAnimationFade];