我有一个视图控制器ViewController1,它有2个segue,一个转到ViewController2,另一个回来。
来自vc2 - vc1的segue被称为" ViewC2toViewC1Segue "
在ViewController2上我有一个UIScrollView,可以加载两个新的viewcontrollers并允许我向左或向右滚动来查看它们。
所有这些工作正常,数据显示正常,一切都很好。但是,在其中一个子视图中,我希望能够显示返回ViewController1的选项。
在我的天真中,我尝试过使用:
performSegueWithIdentifier("ViewC2toViewC1Segue", sender: self)
我希望这张图片有助于解释:
这两个视图控制器在UIScrollView中加载或不在主故事板上加载,因此我无法进行CTRL和DRAG。
如何从UIScrollViews子视图容器之一访问持有UIScrollView的视图控制器(ViewController2)的segue(ViewC2toViewC1Segue)。
我希望这是有道理的。
答案 0 :(得分:1)
执行此操作的最佳方法是使用委托协议。您的父视图控制器将是子代理。当按下该按钮时,它会向其委托(父级,具有滚动视图)发送消息,并且父句柄会滚动到另一个视图控制器。
在ChildViewController文件中,您想要做三件事:
delegate
属性。这允许ChildVC调用委托上的函数。协议声明看起来像这样
protocol ChildViewControllerDelegate: class {
func childViewControllerDidSelectBack(childViewController: ChildViewController)
}
delegate
变量声明如下所示:
class ChildViewController: UIViewController {
weak var delegate: ChildViewControllerDelegate?
}
要调用委托函数,在按钮处理程序代码中只需编写:
delegate.childViewControllerDidSelectBack(self)
在ParentViewController文件中,您想要做三件事:
要将自己设置为委托,每当您实例化子VC时,请执行以下操作:
childVC.delegate = self
要声明您符合协议,请使您的类定义如下:
class ParentViewController: UIViewController, ChildViewControllerDelegate
最后,您需要实现协议功能
func childViewControllerDidSelectBack(childViewController: ChildViewController){
// code to scroll the scrollview
}
}
希望这有帮助!
答案 1 :(得分:0)
您可以在此处使用通知方法。
=============================================== ====
//ViewController2
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(navigateToViewController1) name:@"navigateToViewController1" object:nil];
// Do any additional setup after loading the view from its nib.
}
-(void)navigateToViewController1 {
//[self.navigationController popViewControllerAnimated:YES];
OR
// perform segue
}
//In button click event of your viewcontroller inside scrollview.
[[NSNotificationCenter defaultCenter] postNotificationName:@"navigateToViewController1" object:nil];