Swift - 从BviewController调用AviewController方法

时间:2015-07-25 10:04:52

标签: ios xcode swift methods uiviewcontroller

我有两个viewControllers(AviewController& BviewController)连接而不使用segue。 在AviewController中,我有一个UIScrollview。

我要做的是从BviewController调用一个函数来禁用AviewController中的scrollView(AviewController.scrollView.scrollEnabled = false)

如果不使用segue,我怎么能这样做?

BviewController:

var AV = AviewController ()

func disable_AscrollView (){
         AviewController.scrollView.scrollEnabled = false 
}

2 个答案:

答案 0 :(得分:0)

嗯,您描述的代码不起作用,因为AV与屏幕上显示的AviewController不是AviewController的实例。

有几个选项可以获得正确的实例,这取决于哪个是最好的情况。

  1. 如果您确定整个应用中只有一个static var sharedInstance: AviewController,则可以声明self,并将此变量设置为viewDidLoad AviewController.sharedInstance功能。现在,从应用中的无处不在,您可以将其称为disableScrollView并调用其功能,例如自定义AviewController函数。(这似乎与Swift不兼容,请参阅注释。)

  2. 如果window在视图层次结构中有固定的位置,您可以通过应用程序代理的UIApplication.sharedApplication().delegate.window.rootViewController 属性找到它,例如

    UINavigationController

    根视图控制器可能是NSNotificationCenter,在这种情况下你必须深入挖掘。

  3. 使用viewDidLoad。在AviewController的{​​{1}}中,注册通知:

    NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "disableScrollView:",
        name: "DisableScrollView",
        object: nil)
    

    实施disableScrollView功能(使用@objc将其用作选择器):

    @objc func disableScrollView(notification: NSNotification) {
        // do something
    }
    

    当需要禁用滚动视图时,您只需调用

    即可
    NSNotificationCenter.defaultCenter().postNotificationName(
        "DisableScrollView", object: nil)
    

    来自BviewController

答案 1 :(得分:0)

如果你的AViewController只是init,你可以在init和push / present方法之间修改它的属性。

如果AViewController已经被推送/呈现但不在视图控制器层的顶部(如在AViewController中推送BViewController),您可以尝试委托或通知。

将BViewController的委托设置为AViewController,您可以在AViewController实现的BViewController中使用self.delegate?.disableScrollInAViewController()

或者只是在AViewController中注册通知,并在BViewController中发布通知。