embedded在两个独立容器控制器中的视图之间实现委托

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

我需要实现委派,这样当位置filter控制器中的一个UISteppers是incr./decr时,Master View Controller中的表视图就知道要相应地更新显示的数据。

我并不习惯于与协议/代表合作,但是这种在不同意见之间进行交谈的独特情况实际上欺骗了我! 大多数情况下,我已经成功地遵循这里的例子: 在视图控制器之间传递数据 。 然而,在这种情况下,我不能直接链接实例化视图,因为他指出要在“传回数据”步骤6中进行操作。

我曾经考虑过使用一个singleton对象,从这些对象中,每个视图都可以获取/设置必要的数据,但是这里的问题是,table view不一定知道什么时候更新它的内容,尽pipe有数据可以更新/更新。

这里是一个来自ContainerController.m的代码片段,我在这里设置embedded的segues来运行:

- (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. } } 

谢谢你的帮助!

我认为你是在正确的轨道上设置表视图代理到您的位置filter控制器。

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

 // 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]; } } 

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

  • 将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]; }