按下按钮时iOS tableview冻结,控制台没有错误

Posted

技术标签:

【中文标题】按下按钮时iOS tableview冻结,控制台没有错误【英文标题】:iOS tableview freezes when hitting button, no error in console 【发布时间】:2016-06-03 23:22:19 【问题描述】:

我有一个视图,其中包含如图所示的自定义单元格,当我点击单元格中的按钮时,整个应用程序冻结,我必须强制关闭它并重新启动它。当应用程序冻结时,控制台中没有显示任何内容,我不知道如何调试它。我也尝试过使用非自定义按钮。

Before hitting button

Frozen Screen

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//delete button

@IBAction func deleteButton(sender: AnyObject) 

if phonee == "0"
   let URL = "BLURRED FOR PRIVACY"

    var url : NSString = URL
    var urlStr : NSString = url.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
    var searchURL : NSURL = NSURL(string: urlStr as String)!
    print (searchURL)
    let task = NSURLSession.sharedSession().dataTaskWithURL(searchURL, completionHandler:  (data, response, error) -> Void in
        var urlContent = NSString(data: data!, encoding: NSASCIIStringEncoding) as NSString!
        print(urlContent)

        if urlContent.localizedStandardContainsString("Removed event with ID") 
          dispatch_sync(dispatch_get_main_queue()) 
            var settings = Modal.Settings()
            settings.bodyColor = .whiteColor()
            Modal(title: "Success", body: "Task deleted, refresh the page.", status: .Success, settings: settings).show()
            

            else
            dispatch_sync(dispatch_get_main_queue()) 
            var settings = Modal.Settings()
            settings.bodyColor = .whiteColor()
            Modal(title: "Error", body: "Are you connected to the internet?", status: .Error, settings: settings).show()
            
        
    )
    task.resume()

else
    dispatch_sync(dispatch_get_main_queue()) 
    var settings = Modal.Settings()
    settings.bodyColor = .whiteColor()
    Modal(title: "Error", body: "You can't delete an accepted task", status: .Error, settings: settings).show()
    
    

/////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// ///// //支付按钮

@IBAction func payButton(sender: AnyObject) 

    if phonee == "0"

        dispatch_sync(dispatch_get_main_queue()) 
        var settings = Modal.Settings()
        settings.bodyColor = .whiteColor()
        Modal(title: "Error", body: "Please wait for the task to be accepted", status: .Error, settings: settings).show()
        
        else

        url = url + userID + "&event_id=" + eventID
        let myURL = NSURL(string: url)!

        print (myURL)

        let task = NSURLSession.sharedSession().dataTaskWithURL(myURL, completionHandler:  (data, response, error) -> Void in
            var urlContent = NSString(data: data!, encoding: NSASCIIStringEncoding) as NSString!
            print(urlContent)
        )
        task.resume()

        progressBar.progress = 1.0
        complete1.textColor = UIColor(red: 43/255.0, green: 192/255.0, blue: 228/255.0, alpha: 1.0)
        accepted1.textColor = UIColor.blackColor()

        reportButton.userInteractionEnabled = false
        deleteButton.userInteractionEnabled = false
        contactButton.userInteractionEnabled = false
        payButton.userInteractionEnabled = false
        priceLabel.textColor = UIColor(red: 170/255, green: 170/255, blue: 170/255, alpha: 1.0)
        self.deleteButton.backgroundColor = UIColor(red: 170/255, green: 170/255, blue: 170/255, alpha: 1.0)
        self.contactButton.backgroundColor = UIColor(red: 170/255, green: 170/255, blue: 170/255, alpha: 1.0)
        self.payButton.backgroundColor = UIColor(red: 170/255, green: 170/255, blue: 170/255, alpha: 1.0)
        priceLabel.textColor = UIColor(red: 170/255, green: 170/255, blue: 170/255, alpha: 1.0)
        reportButton.setImage(UIImage(named: "nation2.png"), forState: UIControlState.Normal)


        

/////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// ///// //联系按钮

@IBAction func contactButton(sender: AnyObject) 

    if phonee == "0"
        dispatch_sync(dispatch_get_main_queue()) 
        var settings = Modal.Settings()
        settings.bodyColor = .whiteColor()
        Modal(title: "Error", body: "Please wait for the task to be accepted", status: .Error, settings: settings).show()
        
    else

        if let url = NSURL(string: "tel://\(phonee)") 
            UIApplication.sharedApplication().openURL(url)
        
    

【问题讨论】:

那么,按下按钮有什么作用?执行什么样的代码?有更多细节吗? 按下按钮会提示打开地图、拨打电话号码或获取请求,具体取决于按钮。我有这样的另一种观点,但这种情况永远不会发生。 如果没有显示按下按钮时执行的代码,或者没有显示按钮的目标动作或手势识别器是如何添加到按钮的,那么很难有人提供帮助。我建议你发布一些相关的代码。 添加了所有的按钮代码,我觉得所有的连接都很好 【参考方案1】:

您从主线程调用dispatch_sync(dispatch_get_main_queue()),导致死锁。 IBAction 总是在主线程上调用(除非您从另一个线程手动调用它们),因为所有用户输入都在主线程上处理,因此不需要这样做。

【讨论】:

更好地解释为什么会发生这种情况***.com/questions/12379059/… 非常感谢,我还不太懂线程 您仍然需要在您的 NSURLSession 任务完成处理程序中获取并分派到主队列。如果您从线程开始,坚持使用 dispatch_async 与 dispatch_sync 可能更安全。您可以通过这种方式避免死锁。执行dispatch_async(dispatch_get_main_queue(),... 永远不会死锁,但除了在回调中进行 UI 更新时,代码的所有其他区域都不需要这样做。

以上是关于按下按钮时iOS tableview冻结,控制台没有错误的主要内容,如果未能解决你的问题,请参考以下文章

点击时突出显示 tableview 单元格,按下警报控制器操作按钮时取消突出显示

如何通过在不同的视图控制器上按下按钮来更改 tableview 数据?

从按钮执行 segue 时应用程序冻结

按下“停止”按钮时如何停止动画并冻结图像

swift 3 在tableView 中按下了哪个单元格按钮

单击按钮后,ImGui 冻结