在storyboard中的模态堆栈中解除/委派第二个视图

时间:2012-11-15 15:46:16

标签: ios delegates storyboard modal-dialog

我有一个TableView,它描述了一本书,其中的部分代表了经文的章节和行。

这个TableView的顶部我在导航栏中有一个按钮,允许“导航”。

此导航按钮的目标是允许用户轻松跳转到给定的章节/节而无需手动滚动(可能很长)。

当按下按钮时,会调用tableview控制器显示书中所有可用的章节,当选择章节时,会调用另一个表视图,显示当前章节中可用的经文列表。最后,当选择该行时,显示该书的tablew视图应滚动到给定的索引/行。

所以这个想法:从代表书的tableview我把章节视图称为模态,将经文称为章节视图。

enter image description here

我的问题是我没有明确管理委托并从第二模态视图中解雇。

使用1个模态视图我会做那样的事情。

在显示的VC(View Controller)中,我添加了协议和代理

@protocol ChapitresTableViewControllerDelegate <NSObject>
- (void)didDismissPresentedViewController;
@end

@interface ChapitresTableViewController : UITableViewController
@property (nonatomic, weak) id <ChapitresTableViewControllerDelegate> delegate;
@end

我有didSelectRow

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.delegate didDismissPresentedViewController];
}

在显示VC中我添加以下行

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
  ChapitresTableViewController *chapitresTableViewController = segue.destinationViewController;
  chapitresTableViewController.delegate = self;
}

当然

-(void)didDismissPresentedViewController
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

如果我想在第一个模态VC之后关闭,这样可以正常工作,但我想要的是在我点击第二个之后让第二个被解雇。好的我可以在第二个模态VC中编写协议和内容,但是如何设置委托被发送到第二个VC。

希望我的问题很清楚,解释它并不容易。

任何人都了解我,可以帮助我吗?

注意:我现在知道我没有将任何参数传回给委托,稍后我会做这个滚动。现在我只想关闭第二个视图,然后我将添加所需的东西以将参数传递回委托

1 个答案:

答案 0 :(得分:1)

我确信你可以做到这一点,但是不是带导航栏的模态视图控制器,使用导航控制器会不会更容易?然后,您可以使用popToViewController返回到特定视图控制器所需的多个级别。您可以传递可能要弹出的各种控制器的UIViewController*,也可以通过编程方式传递:{ How to pop back to specify viewController from navigationController(viewControllers/stack)?

在此方案中,保留以前的视图控制器。你弹出的那些被释放(就像你解雇的模态一样被释放),但你推出的那些被保留(就像你在模态世界中呈现的那些被保留)。

如果这本书很大,你必须对内存使用情况敏感。因此,您可能希望处理didReceiveMemoryWarning以在模式序列或推送序列中释放先前视图的模型数据,在这种情况下,在viewDidAppear上,您将需要查看是否应用程序必须释放内存以响应didReceiveMemoryWarning并在这种情况下重新加载它。但无论哪种方式,这都是理想的行为,如果需要,可以优雅地释放页面(并在特定视图重新出现时重新加载),但如果可以,请将其保留在内存中。

最后,您可能还想考虑使用UIPageViewController。鉴于你所描述的内容,我想首先考虑UIPageViewControllerUINavigationController然后将segues推到第二位,并使用模态第三位。