如何检测在表视图委托方法中调用的UIActionSheet按钮的点击?

时间:2014-02-25 22:31:53

标签: objective-c cocoa-touch uitableview ios7 uiactionsheet

好的我有一个带有UIActionSheet的tableView,并且没有segue或任何长的行。用户可以选择滑动并删除行或其他选项,以便将行所代表的用户再次脱机。

当用户滑动时,他们可以删除该行。 当用户点击弹出的UIActionsheet时,会弹出“脱机”选项(破坏性按钮)或取消。

enter image description here

这都包含在tableView委托方法中:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@"%d", [indexPath row]);

    Person *person = [people objectAtIndex:indexPath.row];

    UIActionSheet *popup = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:@"Need to edit %@'s info?", person.name]
                                                       delegate:self
                                              cancelButtonTitle:@"Cancel"
                                         destructiveButtonTitle:@"Take Offline"
                                              otherButtonTitles:nil, nil];
   [popup showInView:tableView];
   [popup addButtonWithTitle:@"Cancel"];


     [people removeObjectAtIndex:[indexPath row]];
    [tableView reloadData];
}

我通常会使用UIActionSheetDelegate方法来检测按钮的敲击。

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 1) {
        NSLog(@"Button 1 was clicked");
    }

}

我遇到的问题是,当我在表格中点击一行时,对象将从数组中删除,并且表格会立即重新加载。

我不希望这种情况发生,直到单击“脱机”按钮但无法找到实现此目的的方法。我尝试了一个未来,例如在实例变量中存储对象并从其他方法访问它们并尝试从tableView方法执行代码但是让我自己感到困惑。

这样做的最佳方式是什么?

亲切的问候

2 个答案:

答案 0 :(得分:2)

我写了一篇关于如何(以及为什么)添加块回调以提醒视图,操作表和动画的博客文章:

http://blog.innovattic.com/uikitblocks/

使用这种方法,您不必使用委托,而是可以改写tableView:didSelectRowAtIndexPath:方法,如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%d", [indexPath row]);

    Person *person = [people objectAtIndex:indexPath.row];

    UIActionSheet *popup = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:@"Need to edit %@'s info?", person.name]
                                              cancelButtonTitle:@"Cancel"
                                         destructiveButtonTitle:@"Take Offline"
                                              otherButtonTitles:nil, nil];

    [popup setHandler:^(UIActionSheet *sheet, NSInteger buttonIndex) {
        [people removeObjectAtIndex:[indexPath row]];
        [tableView reloadData];
    } forButtonAtIndex:[popup destructiveButtonIndex]];

    [popup showInView:tableView];
}

您可以从GitHub下载源文件:

https://github.com/Innovattic/UIKit-Blocks

答案 1 :(得分:0)

嗯,你说你尝试过的方法是正确的。

您需要在属性中保留对所选Person的引用。声明这样的属性:

@property (nonatomic, strong) Person *selectedPerson;

并在didSelectRow...方法中将所选人员存储在此媒体资源中。然后,使用UIActionSheetDelegate方法确定用户单击的按钮。如果他们点击“脱机”,则从selectedPerson阵列中移除您存储在people媒体资源中的人。