app crash whil同时运行集合视图和表视图.Crash:致命错误:在解包可选值时意外发现nil

时间:2016-04-26 06:33:09

标签: ios swift uicollectionview

我有一个水平滚动的集合视图。在该集合视图中每个单元格点击 - 我必须在表格视图中加载相应的数据。所以我将我的表格视图放在集合视图下。

崩溃报告:

fatal error: unexpectedly found nil while unwrapping an Optional value

这是我的代码:

class HomeDiscoverViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet var BTCollectionView: UICollectionView!

    @IBOutlet var DLTableView: UITableView!

    var BTdata = [BTData]()

    var Dealsdata = [DealsData]()

    override func viewDidLoad()
    {
        super.viewDidLoad()
        ListBusinessTypes()
    }
// Values from Api for Business Types
    func ListBusinessTypes()
    {
        let token = NSUserDefaults.standardUserDefaults().valueForKey("access_token") as! String

        let headers = ["x-access-token": token]

        let request = NSMutableURLRequest(URL: NSURL(string: "someurl")!,
                                          cachePolicy: .UseProtocolCachePolicy,
                                          timeoutInterval: 10.0)
        request.HTTPMethod = "GET"
        request.allHTTPHeaderFields = headers

        let session = NSURLSession.sharedSession()
        let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
            if (error != nil)
            {
                print(error)

                let ErrorAlert = UIAlertController(title: "Error", message: "Problem with internet connectivity or server, please try after some time", preferredStyle: UIAlertControllerStyle.Alert)

                // add an action (button)
                ErrorAlert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

                // show the alert
                self.presentViewController(ErrorAlert, animated: true, completion: nil)
            }
            else
            {
                if let json = (try? NSJSONSerialization.JSONObjectWithData(data!, options: [])) as? Dictionary<String,AnyObject>
                {
                    let success = json["success"] as? Int

                    if(success == 1)
                    {
                        if let typeValues = json["data"] as? [NSDictionary]
                        {
                            dispatch_async(dispatch_get_main_queue(),{

                                for item in typeValues
                                {
                                    self.BTdata.append(BTData(json:item))
                                }
                            })
                        }
                        self.BTCollectionView.reloadData()
                    }
                    else
                    {
                        let message = json["message"] as? String

                        print(message)

                        let ServerAlert = UIAlertController(title: "Error", message: message, preferredStyle: UIAlertControllerStyle.Alert)

                        // add an action (button)
                        ServerAlert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

                        // show the alert
                        self.presentViewController(ServerAlert, animated: true, completion: nil)
                    }
                }
            }
        })

        dataTask.resume()
    }

    // values from Api For Deals
    func ListDeals(BTId:String)
    {
        let token = NSUserDefaults.standardUserDefaults().valueForKey("access_token") as! String

        let headers = [
            "cache-control": "no-cache",
            "postman-token": "1befe4c6-ec7c-ccb3-f537-97307f451807"
        ]

        let StringURL = "someurl"+token

        let request = NSMutableURLRequest(URL: NSURL(string: StringURL)!,
                                          cachePolicy: .UseProtocolCachePolicy,
                                          timeoutInterval: 10.0)
        request.HTTPMethod = "GET"
        request.allHTTPHeaderFields = headers

        let session = NSURLSession.sharedSession()
        let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
            if (error != nil)
            {
                print(error)
            }
            else
            {
                if let json = (try? NSJSONSerialization.JSONObjectWithData(data!, options: [])) as? Dictionary<String,AnyObject>
                {
                    let success = json["success"] as? Int

                    if(success == 1)
                    {
                        if let DealsValues = json["data"] as? [NSDictionary]
                        {
                            dispatch_async(dispatch_get_main_queue(),{

                                for item  in DealsValues
                                {
                                    let itemObj = item as? Dictionary<String,AnyObject>

                                    let b_type = itemObj!["business_type"] as? String

                                    if(b_type == BTId)
                                    {
                                        self.Dealsdata.append(DealsData(json:item))
                                    }
                                }
                                self.DLTableView.reloadData()
                            })
                        }
                    }
                    else
                    {
                        let message = json["message"] as? String

                        print(message)

                        let ServerAlert = UIAlertController(title: "Error", message: message, preferredStyle: UIAlertControllerStyle.Alert)

                        // add an action (button)
                        ServerAlert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

                        // show the alert
                        self.presentViewController(ServerAlert, animated: true, completion: nil)
                    }

                }

            }
        })

        dataTask.resume()
    }

    // Mark : Collection View Delegate and Datasource(Business Type)
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
    {
        return BTdata.count
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
    {
        let cell: DDLCollectionCell = collectionView.dequeueReusableCellWithReuseIdentifier("BTCell", forIndexPath: indexPath) as! DDLCollectionCell
        cell.BTName.text = BTdata[indexPath.row].BTNames
        return cell
    }

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
    {
        ListDeals(BTdata[indexPath.row].BTIds!)
    }



    // Mark : Table View Delegate and Datasource(Deals)

    // count of search value and row value that are displaying
    func numberOfSectionsInTableView(tableView: UITableView) -> Int
    {
        return self.Dealsdata.count
    }

    // number of rows
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return 1
    }


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell:DealsListTableCell = self.DLTableView.dequeueReusableCellWithIdentifier("cell") as! DealsListTableCell
        cell.DealName.text = Dealsdata[indexPath.row].DealNames
        cell.DealExpiryDate.text = Dealsdata[indexPath.row].DealAddresses
        return cell
    }

我在这里得到了fatel错误:

self.BTCollectionView.reloadData()

ListBusinessTypes()方法下。我添加了所有委托和数据源。但是我不知道我错过了什么。请帮帮我。

感谢。!!

2 个答案:

答案 0 :(得分:0)

这可能由于两个原因而发生:

  
      
  1. 您可能没有在表视图或集合视图的单元类xib中给出正确的“重用标识符”(在您的情况下:'BTCell'或'cell')。

  2.   
  3. 如果您错误地将“nil”文本设置为标签。

  4.         

    通常,当您的变量设置为nil时会出现此类错误,   但是你的代码期望它不是nil(尝试通过使用错误断点来解决这个问题)。

希望这有助于您解决!

答案 1 :(得分:0)

add Exception Breakpoint from breakpoint navigator.

它会引导你解决问题。