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 ответа:
Как указал @iSee со ссылками. Это происходит потому, что представление не было добавлено в иерархию представлений, поэтому вы не можете перейти к нему. для этого Я.dismissViewControllerAnimated необходимо:
@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) { dim(direction: .Out, speed: dimSpeed) self.dismiss(animated: true) { self.checkInternetConnection() } }
Я предполагаю, что вы новичок в разработке iOS в целом.
Предупреждение не имеет никакого отношения к вашему коду подключения к интернету.
Предупреждение, которое вы получаете, не является ошибкой. Это просто предупреждение.
- причина, по которой вы получаете, хорошо объяснена в этой ссылке и этой
- Чтобы избавиться от этого предупреждения, вы не должны вызывать performSegue из
viewDidLoad
(обратитесь к ссылке выше для получения дополнительной информации.- к для выполнения сетевых проверок рекомендуется использовать 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) }