无法让 UIButton 在 Swift 4 中调用代码块

Posted

技术标签:

【中文标题】无法让 UIButton 在 Swift 4 中调用代码块【英文标题】:Can't get UIButton to call block of code in Swift 4 【发布时间】:2018-08-09 23:03:10 【问题描述】:

我试图在单击按钮(GoButton)后调用一大块代码来运行,我尝试过这样做,但它只是崩溃,我有时也会收到我的按钮等于 nil 的错误。有什么建议吗?如果没有按钮,下面的所有代码都可以正常工作,我希望它在按下后运行。另外,我是快速编程的新手,如果这真的很容易,我很抱歉。谢谢

代码如下:

 override func viewDidLoad() 
        super.viewDidLoad()

        func GoButton(_ sender: Any) 

        guard let APIUrl = URL(string: "https://api.openweathermap.org/data/2.5/weather?q=Crowland&appid=***APIKEY***&units=Metric") else  return 


        URLSession.shared.dataTask(with: APIUrl)  data, response, error in
            guard let data = data else  return 

            let decoder = JSONDecoder()


            do 
                let weatherData = try decoder.decode(MyWeather.self, from: data)

                if (self.MainLabel != nil)
                
                    if let gmain = weatherData.weather?.description 
                        print(gmain)
                        DispatchQueue.main.async 
                            self.MainLabel.text! = "Current Weather in: " + String (gmain)
                        
                    
                

                if (self.LocationLabel != nil)
                
                    if let gmain = weatherData.name 
                        print(gmain)
                        DispatchQueue.main.async 
                            self.LocationLabel.text! = "Current Weather in: " + String (gmain)
                        
                    
                


                if (self.HumidityLabel != nil)
                
                    if let ghumidity = weatherData.main?.humidity
                    
                        print(ghumidity, "THIS IS HUMIDITY")
                        DispatchQueue.main.async 
                        self.HumidityLabel.text! = String (ghumidity)
                        
                    
                

                if (self.WindLabel != nil)
                
                    if let gspeed = weatherData.wind?.speed 
                        print(gspeed, "THIS IS THE SPEED")
                        DispatchQueue.main.async 
                        self.WindLabel.text! = String(gspeed) + " mph"
                        
                    
                

                if (self.TempLabel != nil)
                
                    if let ggtemp = weatherData.main?.temp 
                        print(ggtemp, "THIS IS THE TEMP")
                        DispatchQueue.main.async 
                            self.TempLabel.text! = String (ggtemp) + " c"
                        
                    
                


             catch 
            print(error.localizedDescription)
            
            .resume()
            
        


    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

【问题讨论】:

你是如何初始化你的按钮的? 在哪一行发生了崩溃,或者请用崩溃结果更新您的问题 【参考方案1】:

您的GoButton 函数似乎在您的viewDidLoad 方法中?这绝对不应该是这种情况,因为nested functions 默认情况下对外界是隐藏的。

如果您使用情节提要,将按钮单击链接到操作的正确方法是通过情节提要和 IBActions 来完成。有很多视频/文本教程向您展示如何做到这一点。这是一个我个人喜欢的视频教程,因为它很清晰,因为你是 Swift 新手 - https://www.youtube.com/watch?v=Opz3juSW43Q。 (我既不拥有也不与此链接中的视频内容有任何关联,我只是将其链接到此处,因为我认为它可能会有所帮助。

【讨论】:

以上是关于无法让 UIButton 在 Swift 4 中调用代码块的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UIButton 添加到 Swift Playground?

如何从firebase数据库中检索url并通过UIButton(SWIFT)显示url?

Swift Playgrounds UIButton 无法正常工作

Swift:多个函数同时工作

Swift - UIButton 没有固定在屏幕底部

UIButton不在两个图像之间切换Swift 4.2