如何从Appdelegate调用另一个ViewController的方法?

时间:2015-03-26 14:36:14

标签: ios swift uiviewcontroller appdelegate

从我的appdelegate我需要执行一个来自viewcontroller的方法。

拜托,有人能告诉我如何轻松地从我的appdelegate调用我需要的任何方法吗?

关于这个论点的很多问题但是没有一个是有用的/完整的/正确的,所以请避免将URL发布到其他主题:我已经检查了所有问题,但我真的找不到关于这样做的任何确切答案迅速。 :)

4 个答案:

答案 0 :(得分:7)

这取决于您如何安排视图控制器,但这是一个简单的iPhone主/详细项目的示例。

let root : UINavigationController = self.window!.rootViewController! as UINavigationController
let master : MasterViewController = root.topViewController as MasterViewController
println("\(master.description)")

答案 1 :(得分:0)

我这样做的方法是搜索我想要的视图控制器,从AppDelegate的var window: UIWindow?开始,然后深入到找到它。我最初尝试实现NSNotification但是不建议在swift上使用(我认为计算属性是一个很好的替代,但在这种情况下它不起作用)。

这就是我在ViewController上使用NavigationController为基于选项卡的应用程序所做的工作:

if let rootViewController = self.window?.rootViewController as? UITabBarController
    if let viewControllers = rootViewController.viewControllers {
        for navigationController in viewControllers {
            if let yourViewController = navigationController.topViewController as? YourCustomViewController {
                if yourViewController.hasSomeFlag {
                    yourViewController.theMethod()
                }
                break
            }
        }
    }
}

答案 2 :(得分:-1)

您可以通过通知执行此操作,只需将观察者添加到您的viewcontroller,发布来自您的app委托的通知,此观察者将捕获它并运行您指定的函数。

本教程可帮助您入门:https://www.codefellows.org/blog/how-to-implement-an-nsnotification-observer-in-swift

答案 3 :(得分:-2)

试试这个

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?


func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
    // Override point for customization after application launch.

    return true
}

func customMethod()
{

}
}

从ViewController调用自定义方法

class ViewController: UIViewController {

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    appDelegate.customMethod()
}