viewDidLoad 中未知的情节提要按钮

Posted

技术标签:

【中文标题】viewDidLoad 中未知的情节提要按钮【英文标题】:Storyboard button not known in viewDidLoad 【发布时间】:2018-06-16 19:20:32 【问题描述】:

我有一个带有按钮的 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”。有人知道如何解决这个问题吗?

【问题讨论】:

您可以从情节提要中删除按钮或更改其标签 是的,我也考虑过,但不幸的是这不是原因 当您说“添加了对 viewDidLoad 的新函数调用”时,您添加了什么或者您的意思是您在代码中某处调用 viewDidLoad。此外,如果它来自故事板,为什么不使用 IBOutlet 来代替? 请分享更多代码以获取上下文 @UpholderOfTruth - 我添加了对具有计时器功能的方法的调用。 【参考方案1】:

viewDidLoad 期间,大部分 UI 元素仍然是nil。如果您将调用移至viewWillAppear 甚至viewDidAppear,您会发现元素已被初始化,您可以修改您的myButton 对象。

因为viewWillAppearviewDidAppear 可能会被多次调用,您可能需要稍微更改一下逻辑。

我对“UIViewController 生命周期”进行了一次快速的 Google 搜索,并找到了一些博客文章,如果您想了解更多信息,这些文章会更详细地说明每个标准步骤会发生什么。苹果以前有这样的文章,但我今天找不到了。但是,documentation for UIViewController 的“响应视图事件”和“处理视图相关通知”部分也将为您提供基础知识。

【讨论】:

感谢 Walter 的解释,将给它一个 ty 并查看推荐的文档

以上是关于viewDidLoad 中未知的情节提要按钮的主要内容,如果未能解决你的问题,请参考以下文章

UIStackView 重置其中按钮的属性

情节提要未按预期工作,Xcode 8.3 beta 3

一起使用笔尖和情节提要:将笔尖的按钮目标/动作连接到情节提要中的控制器

如何在 XCode 5 中将类附加到情节提要

带有条件 ViewController 的情节提要

如何在情节提要中使用 NSURLConnection 下载文件