如何创建一个所有视图控制器都可以访问的方法?

时间:2014-12-22 15:47:01

标签: ios xcode swift

到我的应用程序完成时,我将拥有50个左右的视图控制器。为了使用我的应用程序,用户必须具有可用的互联网连接。

我有一个代码可以检查是否存在有效的连接,但是我必须为每个ViewController的每个viewDidLoadviewDidAppear添加相同的代码(在我眼中效率非常低,因为我有每个VC的Swift文件

有没有办法创造一个普遍的"我只在一个地方出现互联网连接代码的方法(所有ViewControllers都可以访问它)?

我正在使用Swift。

4 个答案:

答案 0 :(得分:3)

我现在有机会在Swift 2中进行扩展,以帮助我发送警报消息,而不是每次在每个视图控制器中写下代码我只需写下文本字符串。我将UIAlertController用于较新的IOS版本,将UIAlertView用于旧版本。

只需创建一个新的.swift文件,然后记下所需课程所需的扩展名。

import UIKit

extension UIViewController{

func userNamePassAlert(theTitle: String , theMessage: String){

    if #available(iOS 8.0, *) {
        let userTextFieldEmptyAlert = UIAlertController(title: theTitle, message: theMessage, preferredStyle: UIAlertControllerStyle.Alert)
        let userTextFieldEmptyAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Cancel, handler: { (action) -> Void in

        })
        userTextFieldEmptyAlert.addAction(userTextFieldEmptyAction)
        self.presentViewController(userTextFieldEmptyAlert, animated: true, completion: nil)

    } else {
        // Fallback on earlier versions
        let userTextFieldEmptyAlert = UIAlertView()
        userTextFieldEmptyAlert.title = theTitle
        userTextFieldEmptyAlert.message = theMessage
        userTextFieldEmptyAlert.addButtonWithTitle("Ok")

        userTextFieldEmptyAlert.show()

    }
}

}

这就是我在视图控制器中调用它的方式

else {
         userNamePassAlert("Error Loging In", theMessage: "Username or Password field is empty. Try again")

         }

答案 1 :(得分:2)

使用这个用例,我应该将所有ViewControllers子类化为超类(CommonViewController):

class CommonViewController : UIViewController {
       override func viewDidLoad() {
           super.viewDidLoad() 
           // do your common works for all sub-classes
       }
}

class MyViewController : CommonViewController {
       override func viewDidLoad() {
           super.viewDidLoad()  //call CommonViewController ViewDidLoad
            //... then your work
       }
}

答案 2 :(得分:1)

你可以通过几种方式做到这一点。您可以创建一个全局子类,然后将其子类化。

因此,您拥有代码所在的MyViewController类,然后创建此类的子类而不是UIViewController

或者您可以创建一个类别。或单身。或者只是一个带有类方法的普通类。等等,包含您要运行的代码。

然后在您的视图控制器中,您可以获得代码......

[SomeSharedClass runThisMethod];

在斯威夫特......

SomeSharedClass.runThisMethod()

大卫指出。最好创建一个类别或扩展等......因为子类化可能会导致您必须为几个不同的根类UITableViewControllerUIPageViewControllerUICollectionViewController等创建子类。

答案 3 :(得分:0)

如果您真的设置它,最好的方法是将UIViewController子类化并将其放在init方法中。这样,每次VC实例化时它都会首先运行。因此,不是为所有VC扩展UIViewController,而是扩展您的新VC类。