使用Storyboard处理未知深度的UITableView的最佳方法

时间:2012-12-17 19:49:16

标签: objective-c ios cocoa-touch uistoryboard

我正在创建一个将通过未知深度的故事板。我正在做的是从UITableViewCell创建一个循环segue到它的主视图控制器。在perforSegueWithIdentifier中,我传递的信息是下一个级别。

一切正常,但问题是我是否想要根据该数据分支到详细视图。我不得不求助于带有按钮和幻影视图的黑客。有谁知道这应该如何正式完成?我希望能够将UITableViewCell链接到两个不同的控制器,然后决定在performSegueWithIdentifier中去哪个控制器。这有可能吗?

2 个答案:

答案 0 :(得分:1)

我对故事板没有多少经验,但从我所知的传统UITableView用法来看,单元格不应该告诉视图控制器要做什么。这样做打破了MVC范式。单元格的表视图的委托(通常是显示表视图的视图控制器)将响应方法tableView:didSelectRowAtIndexPath:,然后将执行适当的segue到下一个视图控制器。

为了显示详细视图,表格视图单元格提供附件类型UITableViewCellAccessoryDetailDisclosureButton。使用此类型时,表视图委托可以响应选择器tableView:accessoryButtonTappedForRowWithIndexPath:,然后执行必要的segue以显示详细视图。

我希望这是有道理的。

答案 1 :(得分:0)

我之前做过类似的事情。

我没有找到任何“官方”解决方案,但我找到的一个解决方案是向细胞添加长按手势识别器,除了正常选择外,还引导用户进入细节视图。

但唯一的缺点是,您可以通过某种方式告知用户此“隐藏”选项。

这是viewDidLoad中的代码片段:

UILongPressGestureRecognizer *taskDetail = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(showTaskDetail:)];
taskDetail.minimumPressDuration=0.5f;
taskDetail.numberOfTouchesRequired=1;
[self.myTableView addGestureRecognizer:taskDetail];

然后在我的taskDetail:

-(IBAction)showTaskDetail:(id)sender {
    UILongPressGestureRecognizer *gesture = (UILongPressGestureRecognizer*)sender;
    if (gesture.state == UIGestureRecognizerStateBegan) {
        CGPoint p = [gesture locationInView:TV];
        NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:p];
        MyManagedObj *obj = [self.datasource objectAtIndex:indexPath.row];
        // other operations omitted...
        // then perform segue... 
        [self performSegueWithIdentifier:@"taskDetail" sender:indexPath];

    }
}

我尝试过的其他解决方案是UITableViewCell中的两个按钮,一个用于表向下钻取,另一个用于细节。它也有效,但我的手机太小了,两个按钮没有多少空间。