2014-12-22 3 views
1

К моменту завершения моего приложения у меня будет 50 контроллеров просмотра. Чтобы использовать мое приложение, у пользователя должно быть рабочее интернет-соединение.Как создать метод, к которому имеют доступ все контроллеры представлений?

У меня есть код, который проверяет, есть ли действительная связь, однако я бы добавить тот же код для каждого viewDidLoad или viewDidAppear для каждого ViewController (очень неэффективному в моих глазах, как у меня есть Swift файл для каждого VC)

Есть ли способ создать универсальный метод, в котором у меня есть только код подключения к Интернету в одном месте (и все ViewControllers могут получить к нему доступ)?

Я использую Swift.

+0

Наследование UIViewController (RootViewController) - поместить ваш код в viewDidLoad - и все остальные контроллеры наследуют от вашего RootViewController –

ответ

1

Вы могли бы сделать это несколькими способами. Вы можете создать глобальный подкласс, который затем будет подклассом.

Итак, у вас есть класс MyViewController с кодом, а затем вы создаете подклассы этого вместо UIViewController.

Или вы можете создать категорию. Или синглтон. Или просто обычный класс с методом класса. и т. д., который содержит код, который вы хотите запустить.

Затем в контроллерах зрения вы можете иметь код ...

[SomeSharedClass runThisMethod]; 

В Свифта ...

SomeSharedClass.runThisMethod() 

Как отметил Дэвид. Было бы предпочтительно, чтобы создать категорию или расширение и т.д. ... в качестве подклассов может привести вас к тому, чтобы создать подклассы для нескольких корневых классов UITableViewController, UIPageViewController, UICollectionViewController и т.д ...

+1

три секунды :) Более полный ответ тоже. +1 – d2burke

+4

Обратите внимание, что использование категории/расширения на 'UIViewController' имеет значительные преимущества перед подклассификацией.Прежде всего, если вы примете подход подкласса, вам может потребоваться подкласс 'UIViewController',' UITableViewController', 'UIPageViewController' и т. Д. Единая категория/расширение будет использоваться всеми потомками' UIViewController'. –

0

Лучший способ сделать это, если вы действительно настроены на это, это подкласс UIViewController и поместить его в метод init. Таким образом, он запускается сначала каждый раз, когда создается экземпляр VC. Таким образом, вместо расширения UIViewController для всех ваших VC, вы расширите свой новый класс VC.

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 
     } 
} 
+0

'super.viewDidLoad' вызывает суперкласс, а не родительский. – Logan

+0

Я обновляю ответ с помощью некоторого кода. –

+0

Это выглядит лучше, downvote удален :) – Logan

2

Я просто имел возможность сделать расширение сейчас в Swift 2, чтобы помочь мне отправить уведомление msgs вместо того, чтобы записывать код каждый раз в каждом контроллере представления, я просто записываю текстовую строку. Я использовал 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") 

     } 
Смежные вопросы