6

我的故事板的相关部分如下所示: http://imgur.com/09livAb 您可以看到自定义“容器控制器”视图包含两个容器视图,一个通过嵌入式 segue 链接到导航控制器,另一个链接到自定义“主视图控制器”(其中通过嵌入式 segue 实现表视图控制器。导航控制器组件还与自定义的“位置过滤器控制器”有关系。

我需要实现委托,以便当位置过滤器控制器中的 UISteppers 之一是 incr./decr. 时,主视图控制器中的表视图知道相应地更新它显示的数据。

我并不是不习惯使用协议/代表,但是这种在 segues 中的视图之间进行对话的独特情况真的在欺骗我!在大多数情况下,我在以下示例中取得了成功:在视图控制器之间传递数据。但是,在这种情况下,我无法直接链接实例化视图,正如他在“传回数据”步骤 6 中所指示的那样。

我曾考虑使用一个单例对象,每个视图都可以从中获取/设置必要的数据,但这里的问题是表视图不一定知道何时更新其内容,尽管它有可以/应该更新的数据.

这是来自 ContainerController.m 的代码片段,我在其中设置了嵌入式 segue 以使其正常工作:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    DataHold *data = [[DataHold alloc] init]; // <-- this actually is a singleton object

    if([segue.identifier isEqualToString:@"locationEmbedSegue"])
    {

    }
    else if([segue.identifier isEqualToString:@"tableEmbedSegue"])
    {
        [[segue destinationViewController] setDelegate:data.detailTableViewController];
        // ^ This part actually sets up a delegate so that the table view (Master View Controller)
        // delegates to the detail view controller of the overarching split view controller
        // and tells it what to display when a row is pressed.
    }
}

谢谢你的帮助!

4

2 回答 2

4

我认为您将表视图委托设置为您的位置过滤器控制器是正确的。

我发现使用嵌入式视图控制器的一种简单方法是为它们添加“占位符”属性,并在“执行”segue 时设置这些属性。

// MyContainerController.h
@property (strong, nonatomic) MyLocationFilterController *detailViewController;
@property (strong, nonatomic) UITableViewController *masterViewController;

// MyContainerController.m
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"locationEmbedSegue"])
    {
        UINavigationViewController *dest = (UINavigationViewController *)segue.destinationViewController;
        self.detailViewController = dest.topViewController;
    }
    else if([segue.identifier isEqualToString:@"tableEmbedSegue"])
    {
        self.masterViewController = (UITableViewController *)segue.destinationViewController;
        [self.masterViewController.tableView setDelegate:self.detailViewController];
    }
}
于 2013-06-05T21:38:37.893 回答
0

我最近来到这个问题,发现上面的答案可能有一个问题。

  • 将 setDelete: 方法移出。这确保没有控制器为零。

那么代码就变成了:

// MyContainerController.h
@property (strong, nonatomic) MyLocationFilterController *detailViewController;
@property (strong, nonatomic) UITableViewController *masterViewController;

// MyContainerController.m
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"locationEmbedSegue"])
    {
        UINavigationViewController *dest = (UINavigationViewController *)segue.destinationViewController;
        self.detailViewController = dest.topViewController;
    } else if([segue.identifier isEqualToString:@"tableEmbedSegue"])
    {
        self.masterViewController = (UITableViewController *)segue.destinationViewController;

    }

    [self.masterViewController.tableView setDelegate:self.detailViewController];
}
于 2016-08-29T12:04:24.067 回答