在viewDidLoad中未知的故事板按钮

时间:2018-01-07 17:24:31

标签: ios swift ipad storyboard

我有一个带有按钮的main.storyboard我需要根据应用程序通过家庭Wifi网络或通过云连接到某个设备来更改图像。我给了按钮一个标签号。

在viewDidLoad中,我检查连接并根据需要更改图像。我这样做是通过

let myButton = view.viewWithTag(int) as! UIButton
myButton.setImage(UIImage(named: “imageName.png”), for .normal)

我的viedDidLoad看起来像这样

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(setHomeMenuButton), name:NSNotification.Name(rawValue: "refresh"), object: nil)



    checkSavedHomeyAccessData()                     // get Homey's url data from disk if there are

    if appStageLevel > 0 && firstStartAppFlag  {

        firstStartAppFlag = false
        let flag = checkDataStore()

        if flag == 2 {                              // store is already filled, then get iconViews
            DeviceService.getDevicesNameArray() 
            getIconFiles()
        }

    }

    manageViewBasedAppStageLevel()                    // setup views based on stage 

    let networkName = currentSSID()
    timerMapCapabilitiesUpdate()      
}

这一功能非常好,直到今天。我在viewDidLoad函数中添加了一个新的函数调用,应用程序在启动后直接崩溃,告诉我'let myButton = ...'的行意外地找到了nill。

这是从viewDidLoad调用的函数:

func timerMapCapabilitiesUpdate() {

  let mapCapabilityArray = getMapCapabilityArray()

  _ = Timer.scheduledTimer(withTimeInterval: 20, repeats: true, block: { (timer) in  // 1


        if self.currentReachabilityStatus != .notReachable {


            if mapCapabilityArray.count != 0 {

                for capabilityOnMap in mapCapabilityArray {

                    getLiveData2Values(tag : capabilityOnMap.tag)

                } // for deviceOnMap

            } // if mapDeviceArray

        } else {

            if let viewWithTag = self.view.viewWithTag(6) {
                viewWithTag.isHidden = false
                self.view.bringSubview(toFront: viewWithTag)
                // print("No Internet Connection")
            }

        } // if internet available

    }) // end timer block

} // end timerMapDevicesUpdate

这意味着我谦虚地认为故事板在viewDidLoad方法启动之前没有加载。因为如果故事板被加载,那么展开就不会产生'nill'。谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

viewDidLoad期间,大多数UI元素仍为nil。如果您将来电移至viewWillAppear甚至viewDidAppear,您会发现元素已初始化,您可以修改myButton对象。

由于viewWillAppearviewDidAppear可以被多次调用,因此您可能需要更改一下逻辑。

我做了一个关于“UIViewController生命周期”的快速Google,并发现了一些博客文章,详细介绍了如果您想了解更多内容,每个标准步骤会发生什么。 Apple曾经有过这样的文章但我今天找不到它。但是,documentation for UIViewController的“响应视图事件”和“处理视图相关通知”部分也将为您提供基础知识。