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()

}

затем у меня есть функция с кодом из проекта 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.тотем.обучение / swift-ios-советы-рекомендации-учебники-блог / ux-chops-dim-the-lights) the mainToAlertNoInternet загружает следующий вид над текущим с прозрачностью, так что это стиль оповещения.

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

enter image description here

эта кнопка повторной попытки связана с выходом из Segue и запускает это функция в контроллере первого вида:

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

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

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

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

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

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

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

ценю вашу помощь. Заранее спасибо

Edit:

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

override func viewDidAppear(_ animated: Bool) {
    checkInternetConnection()
}

однако он не запускается. Также тусклый в unwindFromSecondary функция не вызывается, когда я делаю это.

Edit 2:

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

print("Appeared")

это вызывается изначально, но затем не снова.

вопрос:

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

какие мысли?

обновление 3

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

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

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

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

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

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

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

Спасибо за ваше время. Это очень ценится.

3 ответов


как @iSee указал со ссылками. Это связано с тем, что представление не было добавлено в иерархию представлений, поэтому вы не можете перейти к нему. за это self.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: пожалуйста, обратитесь к этой ссылка здесь для получения дополнительной информации о этого. Я мог бы легко перепечатать его здесь, но поскольку на него уже ответили, Вы можете обратиться к приведенной выше ссылке о том, почему это происходит и как этого избежать.


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

 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)
    }