我有一个TableView,它描述了一本书,其中的部分代表了经文的章节和行。
这个TableView的顶部我在导航栏中有一个按钮,允许“导航”。
此导航按钮的目标是允许用户轻松跳转到给定的章节/节而无需手动滚动(可能很长)。
当按下按钮时,会调用tableview控制器显示书中所有可用的章节,当选择章节时,会调用另一个表视图,显示当前章节中可用的经文列表。最后,当选择该行时,显示该书的tablew视图应滚动到给定的索引/行。
所以这个想法:从代表书的tableview我把章节视图称为模态,将经文称为章节视图。
我的问题是我没有明确管理委托并从第二模态视图中解雇。
使用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。
希望我的问题很清楚,解释它并不容易。
任何人都了解我,可以帮助我吗?
注意:我现在知道我没有将任何参数传回给委托,稍后我会做这个滚动。现在我只想关闭第二个视图,然后我将添加所需的东西以将参数传递回委托
答案 0 :(得分:1)
我确信你可以做到这一点,但是不是带导航栏的模态视图控制器,使用导航控制器会不会更容易?然后,您可以使用popToViewController
返回到特定视图控制器所需的多个级别。您可以传递可能要弹出的各种控制器的UIViewController*
,也可以通过编程方式传递:{ How to pop back to specify viewController from navigationController(viewControllers/stack)?
在此方案中,保留以前的视图控制器。你弹出的那些被释放(就像你解雇的模态一样被释放),但你推出的那些被保留(就像你在模态世界中呈现的那些被保留)。
如果这本书很大,你必须对内存使用情况敏感。因此,您可能希望处理didReceiveMemoryWarning
以在模式序列或推送序列中释放先前视图的模型数据,在这种情况下,在viewDidAppear
上,您将需要查看是否应用程序必须释放内存以响应didReceiveMemoryWarning
并在这种情况下重新加载它。但无论哪种方式,这都是理想的行为,如果需要,可以优雅地释放页面(并在特定视图重新出现时重新加载),但如果可以,请将其保留在内存中。
最后,您可能还想考虑使用UIPageViewController
。鉴于你所描述的内容,我想首先考虑UIPageViewController
,UINavigationController
然后将segues推到第二位,并使用模态第三位。