2016-09-17 44 views
8

好的,所以我对Swift来说很新,对于我正在尝试做什么,或者如果我走错了方向,我有点困惑。 (https://github.com/ashleymills/Reachability.swiftSwift 3:检查Internet(Reocurring)viewDidAppear不是

这里是我的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.totem.training/swift-ios-tips-tricks-tutorials-blog/ux-chops-dim-the-lightsmainToAlertNoInternet以透明方式加载当前视图的下一个视图,因此它是一种警告样式。

因此,第二个segue上有一个视图和一个按钮。没有壮观这是当没有互联网什么是装:

enter image description here

那再试一次按钮链接到Segue公司的退出并运行在第一个视图控制器此功能:

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

我在函数mainToAlertNoInternet中添加了这样的内容,当他们再次单击时,它会返回到第一个segue并再次运行测试。然而,当我点击再试一次,我得到这个错误:

Warning: Attempt to present on whose view is not in the window hierarchy!

希望我已经解释够我所成立。现在的问题:

1)我该如何解决这个错误? 2)我是以正确的方式做还是有更好的方法?

这就是我想要的:

我要检查Internet连接的那一刻应用程序加载。如果没有连接,我想像我一直在做的那样显示segue。如果用户点击尝试增益,我希望它返回到第一个控制器并再次运行检查,并且如果仍然没有连接显示继续,就像它再次执行一样。我希望这是一个重复的过程,直到有互联网。

感谢您的帮助。在此先感谢

编辑:

我已经添加了函数调用的方法ViewDidAppear像这样:

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

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

编辑2:

刚加入这一行到我viewDidAppear

print("Appeared") 

这被最初称,但随后不再。

问:

我如何获得一个功能,一旦一切都在unwindSegue后再次加载运行?

有什么想法?

更新3

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

@MarkP回答工作正常。谢谢你 但是,@iSee的答案让我想到也许我应该以不同的方式来解决这个问题。

我加入悬赏这个职位的详细解答,可以告诉我,并解释如何实现以下目标:

在我的应用程序。我需要确保互联网存在(也许一个定时器)在任何加载视图。

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

看来,在App代表会的地方,但我不能确定如何实现:使像目前这样,如果没有互联网,将弹出的ViewController这个赛格瑞我想它这个。

我是iOS开发新手,因此会对一些解释和教导感激。

谢谢你的时间。非常感谢。

+0

可能的复制[其视图不在窗口层次结构中](http://stackoverflow.com/a/12320222/2108547) –

回答

2

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

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

} 
3

我认为你是一般的iOS开发新手。

  1. 此警告与您的互联网连接代码无关。

  2. 您收到的警告不是错误。这只是一个警告。

  3. 你得到的理由是很好的解释这个linkthis
  4. 摆脱viewDidLoad(参见上面的链接以获取更多信息。
  5. 要执行消除那个警告performSegue的,你不应该叫你的网络的检查,最好是使用AppDelegate中(让您的应用程序的流量更好的控制)

一切顺利:)

编辑:请参考到this链接这里获取更多信息。我可以很容易地在这里重新发布它,但由于它已经得到解答,您可以参考上面的链接,了解它为什么发生以及如何避免它。

+0

是的,你是对的,我是一般iOS Dev的新手。你认为在我需要做什么时你可以更具体一些吗? – JamesG

0

我在应用程序委托使用 - >

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