Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何创建所有视图控制器都可以访问的方法?_Ios_Xcode_Swift - Fatal编程技术网

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

Ios 如何创建所有视图控制器都可以访问的方法?,ios,xcode,swift,Ios,Xcode,Swift,当我的应用程序完成时,我将拥有50个左右的视图控制器。要使用我的应用程序,用户必须具有工作的internet连接 我有一个检查是否存在有效连接的代码,但是我必须为每个ViewController的每个viewDidLoad或ViewDidAspect添加相同的代码(在我看来效率很低,因为我为每个VC都有一个Swift文件) 是否有一种方法可以创建一个“通用”方法,其中我只在一个位置显示Internet连接代码(并且所有ViewController都可以访问它) 我用的是Swift。你可以用几种方

当我的应用程序完成时,我将拥有50个左右的视图控制器。要使用我的应用程序,用户必须具有工作的internet连接

我有一个检查是否存在有效连接的代码,但是我必须为每个ViewController的每个
viewDidLoad
ViewDidAspect
添加相同的代码(在我看来效率很低,因为我为每个VC都有一个Swift文件)

是否有一种方法可以创建一个“通用”方法,其中我只在一个位置显示Internet连接代码(并且所有ViewController都可以访问它)


我用的是Swift。

你可以用几种方法。您可以创建一个全局子类,然后创建一个子类

因此,您的
MyViewController
类中包含了代码,然后您创建了该类的子类,而不是
UIViewController

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

然后在视图控制器中,您可以使用以下代码

[SomeSharedClass runThisMethod];
在斯威夫特

SomeSharedClass.runThisMethod()

正如大卫指出的那样。最好创建一个类别或扩展等。。。因为子类化可能导致您必须为几个不同的根类创建子类,
UITableViewController
UIPageViewController
UICollectionViewController
,等等。

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

在本用例中,我应该将所有ViewController子类化为一个超类(CommonViewController):


我刚刚有机会在Swift 2中做了一个扩展,帮助我发送警报MSG,而不是每次在每个视图控制器中写下代码,我只是写下文本字符串。我对较新的IOS版本使用UIAlertController,对旧版本使用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请注意,在
UIViewController
上使用类别/扩展比将其子类化有显著优势。基本上,如果您采用子类方法,您可能需要子类化
UIViewController
UITableViewController
UIPageViewController
,等等。所有
UIViewController
子类都可以使用单个类别/扩展。
super.viewDidLoad
调用超类,不是父类。正如我在Fogmeisters的回答中指出的,子类方法对于大多数应用程序来说都是次优的,因为您通常至少有
UIViewController
UITableViewController
的后代,所以必须在多个位置使用相同的代码。最好创建扩展名。是和否。您不能向类别添加其他属性。类别用于其他方法。继承UIViewController(RootViewController)—将代码放入viewDidLoad—所有其他控制器都从RootViewController继承
else {
         userNamePassAlert("Error Loging In", theMessage: "Username or Password field is empty. Try again")

         }