首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 3:检查互联网(重新锁定) viewDidAppear not

Swift 3:检查互联网(重新锁定) viewDidAppear not
EN

Stack Overflow用户
提问于 2016-09-17 14:20:32
回答 3查看 849关注 0票数 8

好吧,所以我对斯威夫特很陌生,我对我想做的事情有点困惑,或者我是不是走错了方向。(https://github.com/ashleymills/Reachability.swift)

下面是我的viewDidLoad方法:

代码语言:javascript
复制
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    checkConnection()

}

然后,我使用Reachability项目中的代码进行了一个函数:

代码语言:javascript
复制
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")
    }
}

正如您所看到的,当没有互联网时,这是代码:

代码语言:javascript
复制
self.dim(direction: .In, alpha: self.dimLevel, speed: self.dimSpeed)
            self.performSegue(withIdentifier: "mainToAlertNoInternet", sender:  self)

Dim是从(http://www.totem.training/swift-ios-tips-tricks-tutorials-blog/ux-chops-dim-the-lights)获取的,mainToAlertNoInternet以透明的方式加载当前视图的下一个视图,因此它是一种警报样式。

因此,第二个索引有一个视图和一个按钮在上面。没什么了不起的--这就是当没有互联网时加载的内容:

重试按钮链接到Segue的出口,并在第一个视图控制器中运行此函数:

代码语言:javascript
复制
@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
    dim(direction: .Out, speed: dimSpeed)
    checkInternetConnection()
}

我添加了函数mainToAlertNoInternet,以便当他们再次单击“尝试”时,它将返回到第一个segue并再次运行测试。但是,当我再次单击“尝试”时,会得到以下错误:

警告:尝试显示其视图不在窗口层次结构中!

希望我已经解释了我所建立的一切。现在来回答以下问题:

( 1)我如何纠正这个错误?( 2)我这样做是正确的还是有更好的方法?

这就是我想要的:

我想要检查互联网连接的时候,该应用程序加载。如果没有连接,我想像我一直在做的那样显示这个索引。如果用户单击“尝试增益”,我希望它返回到第一个控制器并再次运行检查,如果仍然没有连接显示segue,就像它最初做的那样。我希望这是一个重复的过程,直到有互联网。

感谢你的帮助。提前感谢

编辑:

我在ViewDidAppear方法中添加了如下函数调用:

代码语言:javascript
复制
override func viewDidAppear(_ animated: Bool) {
    checkInternetConnection()
}

但是,它不运行。而且,当我这样做时,unwindFromSecondary函数中的DIM不会被调用。

编辑2:

刚把这行添加到我的viewDidAppear

代码语言:javascript
复制
print("Appeared")

这最初会被调用,但不会再次调用。

问题:

在unwindSegue之后重新加载了所有的东西之后,如何获得一个函数来运行呢?

有什么想法吗?

更新3

好的,我看了下面的答案:

@MarkP的答案很好。不过,谢谢你,@iSee的回答让我想,也许我应该换一种方式去做这件事。

我在这篇文章中添加了一个Bounty,以获得一个详细的答案,可以向我展示并解释如何实现以下目标:

在我的应用程序里。我需要不断地确保互联网存在于任何加载的视图上(也许是一个计时器)。我希望这样,就像当前的方式一样,如果没有互联网,它将弹出ViewController,其中包含以下内容:

代码语言:javascript
复制
performSegue(withIdentifier: "mainToAlertNoInernet", sender: self)

这似乎是应用程序代表的地方,但我不知道如何实现这一点。

我是iOS开发的新手,因此希望得到一些解释和教学。

谢谢您抽时间见我。我们对此深表感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-18 23:22:39

如@iSee所指出的链接。这是因为视图尚未添加到视图层次结构中,因此无法移动到它。为此,需要self.dismissViewControllerAnimated

代码语言:javascript
复制
@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
    dim(direction: .Out, speed: dimSpeed)
    self.dismiss(animated: true) {
        self.checkInternetConnection()
    }

}
票数 2
EN

Stack Overflow用户

发布于 2016-09-17 15:12:34

我想您一般都是iOS开发的新手。

  1. 此警告与您的互联网连接代码无关。
  2. 您收到的警告不是错误。这只是一个警告。
  3. 在这个linkthis中很好地解释了你得到这个的原因。
  4. 要消除该警告,您不应该从performSegue调用viewDidLoad(有关更多信息,请参阅上面的链接)。
  5. 要执行网络检查,最好使用AppDelegate (让您更好地控制应用程序的流)。

(最好的:)

编辑:有关这方面的更多信息,请参考这里的this链接。我可以轻松地在这里重新发布它,但是由于它已经被回答了,您可以参考上面的链接来解释为什么会发生,以及如何避免它。

票数 3
EN

Stack Overflow用户

发布于 2016-09-19 06:24:23

我在应用程序委托->中使用了这个

代码语言:javascript
复制
 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()
        })
    }

然后在基本文件->中

代码语言:javascript
复制
 func isReachable() -> Bool {
        return NSUserDefaults.standardUserDefaults().boolForKey(REACHABLE_KEY)
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39547851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档