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
загружает следующий вид над текущим с прозрачностью, так что это стиль оповещения.
Итак, второй сегмент имеет вид и кнопку на нем. Ничего эффектного это то, что загружается, когда нет интернета:
эта кнопка повторной попытки связана с выходом из 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-разработке в целом.
предупреждение не имеет ничего общего с вашим кодом подключения к интернету.
предупреждение вы получаете не ошибка. Это просто предупреждение.
- причина, по которой вы получаете это хорошо объясняется в этом ссылке и этой
- чтобы избавиться от этого предупреждения, вы не должны вызывать performSegue из
viewDidLoad
(см. ссылку выше для получения дополнительной информации. - для выполнения проверки сети, рекомендуется использовать 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)
}