根据 UITableView 中的单元格选择呈现正确的 View Controller 实例

Presenting correct View Controller instance depending on cell selection in UITableView

我知道这可能包含在我在网站上看到的其他问题的答案中(请参阅参考资料),但由于我的经验有限,我无法理解与以下内容相关的每个部分我的代码。如有重复请见谅

我有一个名为 threadsViewController 的 PFQueryTableViewController(本质上是一个 UITableViewController),它从 Parse 后端获取单元格信息。 table 视图由类似于您在网络论坛上看到的线程组成。

然后我有一个单独的 class postsViewController,这是另一个 PFQueryTableViewController,我希望显示对该特定线程的所有响应('posts')的 table .

我正在寻找的功能是让用户点击线程(图像中的左侧屏幕)以显示 postsViewController(右侧屏幕),其中仅包含与 posts/responses 相关的内容到那个线程。 (见下面的基本图)。

我从研究中了解到:

我需要什么帮助:

我知道如何完成 PFQueries 等来获取单元格的数据,我只是不知道如何实现导航以及如何告诉 postsViewController 要显示哪些帖子。

如果它能以某种方式提供帮助,这是我到目前为止的实现。我已经尝试将 属性 添加到名为 fromThreadpostsViewController 以某种方式存储线程,但除此之外我没有想法!

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [super tableView:tableView didSelectRowAtIndexPath:indexPath];

    postsViewController *postsVC = [[postsViewController alloc] init];
    postsVC.fromThread = //?
    [self performSegueWithIdentifier:@"threadsToPosts" sender:self];
}

参考资料

How to filter a Parse query by an tableview index?

Pass Index Number between UITableView List segue

didSelectRowAtIndexPath and prepareForSegue implementation

你走在正确的轨道上。您需要知道如何做两件事:(1) 通过 indexPath 访问您的解析对象,以及 (2) 在导航控制器中推送一个新的视图控制器。

(1) 更简单:PFQueryTableVC 提供了一个名为 objectAtIndexPath: 的方法,它可以满足您的需求。

// indexPath is the indexPath parameter to the didSelectRow delegate method
PFObject *fromThread = [self objectAtIndexPath:indexPath];

(2) 也很简单。但更复杂,因为有几种方法可以做到这一点。 Segue 是更现代的方式,但我认为旧方式更简单,当然更容易用代码描述。视图控制器在情节提要编辑器的 "Identity" 选项卡上获得情节提要 ID。为您的帖子呈现 VC 提供故事板 ID,例如 "PostVC".

要获取新实例,请使用该故事板 ID,如下所示:

MyPostVC *postVC = [self.storyboard instantiateViewControllerWithIdentifier:@"PostVC"];
// initialize it with the PFObject we got above
postVC.fromThread = fromThread;

// present it on the navigation stack
[self.navigationController pushViewController:postVC animated:YES];

fromThread 正是 PostVC 查询与所选主题关联的帖子所需要的。

您可以将单元格的数据传递给 prepareForSegue 中的下一个 ViewController,像这样

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([segue.identifier isEqualToString:@"threadsToPosts"]) {
        UINavigationController *navCon = segue.destinationViewController;
        postsViewController *postsViewController = [navCon.viewControllers objectAtIndex:0];
        // Whatever you are populating your tableView with
        Thread *thread = [self.thread objectAtIndex:self.tableView.indexPathForSelectedRow.row];
        postsViewController.thread = thread;
    }
}