【问题标题】:Swift: Access Parent ViewController Segue from UIScrollViewSwift:从 UIScrollView 访问父 ViewController Segue
【发布时间】:2016-02-24 10:19:10
【问题描述】:

到目前为止我所拥有的

我有一个视图控制器 ViewController1,它有 2 个 segue,一个去 ViewController2,一个返回。

从vc2到vc1的segue叫做“ViewC2toViewC1Segue

在 ViewController2 上,我有一个 UIScrollView,它加载了两个新的视图控制器并允许我向左或向右滚动以查看它们。

所有这些工作正常,数据显示正常,一切都很好。但是,在其中一个子视图上,我希望能够显示返回 ViewController1 的选项。

天真地我尝试使用:

performSegueWithIdentifier("ViewC2toViewC1Segue", sender: self)

我希望这张图片有助于解释:

问题

这两个视图控制器在 UIScrollView 中加载或不在主情节提要上,因此我无法 CTRL 和 DRAG。

问题

如何访问从 UIScrollViews 子视图容器之一持有 UIScrollView 的视图控制器 (ViewController2) 的 segue (ViewC2toViewC1Segue)。

我希望这是有道理的。

【问题讨论】:

  • 为什么不将两个 UIScrollViews 子视图控制器添加为 ViewController2 的实际子视图控制器,以便它们可以访问它们的父视图并从那里执行Segue?

标签: ios swift uiscrollview segue


【解决方案1】:

最好的方法是使用委托协议。您的父视图控制器将是孩子的代表。当按钮被推到子级时,它会向其委托(拥有滚动视图的父级)发送消息,并且父级处理滚动到另一个视图控制器。


在您的 ChildViewController 文件中,您想要做 3 件事:

  1. 定义委托协议。这是委托对象需要实现的一组函数。
  2. delegate 属性添加到 ChildVC 类。这允许 ChildVC 调用委托上的函数。
  3. 按下按钮时调用委托函数

协议声明看起来像这样

protocol ChildViewControllerDelegate: class { func childViewControllerDidSelectBack(childViewController: ChildViewController) }

delegate 变量声明如下所示:

class ChildViewController: UIViewController { weak var delegate: ChildViewControllerDelegate? }

要调用委托函数,只需在您的按钮处理程序代码中编写:

delegate.childViewControllerDidSelectBack(self)


在您的 ParentViewController 文件中,您想要做 3 件事:

  1. 将自己设置为 ChildVC 的代表
  2. 声明您遵守 ChildVCDelegate 协议
  3. 实现委托协议方法

要将自己设置为委托,每当您实例化子 VC 时,请执行以下操作:

childVC.delegate = self

要声明您符合协议,请使您的类定义如下所示:

class ParentViewController: UIViewController, ChildViewControllerDelegate

最后,你需要实现协议功能

func childViewControllerDidSelectBack(childViewController: ChildViewController){ // code to scroll the scrollview } }


希望这会有所帮助!

【讨论】:

  • 嘿,谢谢。说到 swift,我是个小菜鸟。你能提供更多细节吗?我很困惑如何从按钮单击等调用此协议...
【解决方案2】:

您可以在此处使用通知方法。

  • 单击您的 ViewController(在滚动视图中)帖子之一的按钮 通知。
  • 在 ViewController2 的 viewDidLoad 方法中添加观察者。
  • 在选择器方法中返回 ViewController1。

================================================ ====

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2016-10-02
    • 1970-01-01
    • 2015-04-04
    • 2015-10-03
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多