Swift 3: Проверка Интернета (переориентация) viewDidAppear нет


Итак, я довольно новичок в Swift, и я немного смущен тем, что я пытаюсь сделать, или если я иду в неправильном направлении. (https://github.com/ashleymills/Reachability.swift )

Вот мой метод viewDidLoad:

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

    checkConnection()

}

Затем у меня есть функция с кодом из проекта Reachability GitHub:

func checkConnection() {
    //declare this property where it won't go out of scope relative to your listener
    let reachability = Reachability()!

    reachability.whenReachable = { reachability in
        // this is called on a background thread, but UI updates must
        // be on the main thread, like this:
        DispatchQueue.main.async {
            if reachability.isReachableViaWiFi {
                print("Reachable via WiFi")
            } else {
                print("Reachable via Cellular")
            }
        }
    }
    reachability.whenUnreachable = { reachability in
        // this is called on a background thread, but UI updates must
        // be on the main thread, like this:
        DispatchQueue.main.async {

            self.dim(direction: .In, alpha: self.dimLevel, speed: self.dimSpeed)
            self.performSegue(withIdentifier: "mainToAlertNoInternet", sender:  self)
        }
    }

    do {
        try reachability.startNotifier()
    } catch {
        print("Unable to start notifier")
    }
}

Как вы можете видеть, когда нет интернета, это код:

self.dim(direction: .In, alpha: self.dimLevel, speed: self.dimSpeed)
            self.performSegue(withIdentifier: "mainToAlertNoInternet", sender:  self)

Тусклый взят из (http://www.тотем.training/swift-ios-tips-tricks-tutorials-blog / ux-chops-dim-the-lights ) mainToAlertNoInternet загружает следующий вид поверх текущего с прозрачностью, так что это стиль оповещения.

Итак, второй сегмент имеет вид и кнопку на нем. Ничего впечатляющего это то, что загружается, когда нет интернета:

Введите описание изображения здесь

Эта кнопка try again связана с выходом из Segue и запускает эту функцию в первом представлении Контроллер:

@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
    dim(direction: .Out, speed: dimSpeed)
    checkInternetConnection()
}

Я добавил в функцию mainToAlertNoInternet так, что когда они нажмут try again, она вернется к первому сегменту и снова запустит тест. Однако, когда я нажимаю кнопку попробовать еще раз, я получаю эту ошибку:

Предупреждение: попытайтесь представить, чей вид не находится в иерархии окон!

Надеюсь, я достаточно объяснил, что я установил. Теперь к вопросам:

1) Как я могу исправить эту ошибку? 2) я делаю это правильно или есть лучший способ путь?

Вот чего я хочу:

Я хочу проверить подключение к интернету в момент загрузки приложения. Если нет связи, я хочу отобразить сегмент, как я это делал. Если пользователь нажимает Try gain, я хочу, чтобы он вернулся к первому контроллеру и снова запустил проверку, и если по-прежнему нет подключения, снова отобразил сегмент, как это было изначально. Я бы хотел, чтобы этот процесс повторялся до тех пор, пока не появится интернет.

Ценю всю вашу помощь. Спасибо продвижение

Правка:

Я добавил вызов функции в метод ViewDidAppear следующим образом:

override func viewDidAppear(_ animated: Bool) {
    checkInternetConnection()
}
Однако он не работает. Кроме того, DIM в функции unwindFromSecondary не вызывается, когда я делаю это.

Правка 2:

Просто добавил эту строку в мой viewDidAppear:

print("Appeared")

Это вызывается первоначально, но затем не снова.

Вопрос:

Как заставить функцию работать после того, как все загрузилось снова после unwindSegue?

Есть какие-нибудь соображения?

Обновление 3

Хорошо, поэтому я посмотрел ответы ниже:

@ответ MarkP работает отлично. Спасибо Вам за это Однако ответ от @iSee заставил меня задуматься о том, что, возможно, мне следует пойти по другому пути.

Я добавил награду к этому посту за подробный ответ, который может показать мне и объяснить, как достичь следующего:

В моем приложении. Мне нужно продолжать убеждаться, что интернет существует (возможно, таймер) на любом загружаемом представлении. Я хотел бы, чтобы это было так, что, как и текущий способ, если нет интернета, он будет всплывать ViewController с этим сегментом:

performSegue(withIdentifier: "mainToAlertNoInernet", sender: self)

Похоже, что делегат приложения будет местом, но я не уверен, как этого достичь.

Я новичок в разработке iOS и поэтому был бы признателен за некоторые объяснения и обучение.

Спасибо, что уделили мне время. Это очень ценится.
3 8

3 ответа:

Как указал @iSee со ссылками. Это происходит потому, что представление не было добавлено в иерархию представлений, поэтому вы не можете перейти к нему. для этого Я.dismissViewControllerAnimated необходимо:

@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
    dim(direction: .Out, speed: dimSpeed)
    self.dismiss(animated: true) {
        self.checkInternetConnection()
    }

}

Я предполагаю, что вы новичок в разработке iOS в целом.

  1. Предупреждение не имеет никакого отношения к вашему коду подключения к интернету.

  2. Предупреждение, которое вы получаете, не является ошибкой. Это просто предупреждение.

  3. причина, по которой вы получаете, хорошо объяснена в этой ссылке и этой
  4. Чтобы избавиться от этого предупреждения, вы не должны вызывать performSegue из viewDidLoad(обратитесь к ссылке выше для получения дополнительной информации.
  5. к для выполнения сетевых проверок рекомендуется использовать AppDelegate (дает вам лучший контроль над потоком приложения)

Всего наилучшего :)

EDIT: пожалуйста, обратитесь к ссылкеthis здесь для получения дополнительной информации об этом. Я мог бы легко перепечатать его здесь, но поскольку на него уже дан ответ, вы можете сослаться на приведенную выше ссылку о том, почему это происходит и как этого избежать.

Я использую это в делегате приложения - >

 func reachablityCode() {
        AFNetworkReachabilityManager.sharedManager()
        AFNetworkReachabilityManager.sharedManager().startMonitoring()
        AFNetworkReachabilityManager.sharedManager().setReachabilityStatusChangeBlock({(status) in
            let defaults = NSUserDefaults.standardUserDefaults()
            if status == .NotReachable {
                defaults.setBool(false, forKey:REACHABLE_KEY)
            }
            else {
                defaults.setBool(false, forKey: REACHABLE_KEY)
            }
            defaults.synchronize()
        })
    }

И затем это в базовом файле - >

 func isReachable() -> Bool {
        return NSUserDefaults.standardUserDefaults().boolForKey(REACHABLE_KEY)
    }