UITableView = nil,致命错误:在展开Optional值时意外发现nil

时间:2015-07-08 18:44:03

标签: ios swift uitableview

我在self.tableView.reloadData()收到错误。是不是因为我使用的是SSASideMenu lib,菜单和其他视图之间没有分段?对我而言,似乎我的tableView未初始化。

class GroupListViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var TableData:Array< String > = Array < String >()

@IBOutlet var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    get_data_from_url("http://www.kaleidosblog.com/tutorial/tutorial.json")

    title = "title"
    var menuImage:UIImage = UIImage(named: "sidebtn")!
    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "1", style: .Plain, target: self, action: "presentLeftMenuViewController")
    menuImage = menuImage.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
    self.navigationItem.leftBarButtonItem?.image = menuImage



    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}
 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return TableData.count
}

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
    cell.textLabel?.text = TableData[indexPath.row]
    return cell
}
func get_data_from_url(url:String)
{
    let httpMethod = "GET"
    let timeout = 15
    let url = NSURL(string: url)
    let urlRequest = NSMutableURLRequest(URL: url!,
        cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData,
        timeoutInterval: 15.0)
    let queue = NSOperationQueue()
    NSURLConnection.sendAsynchronousRequest(
        urlRequest,
        queue: queue,
        completionHandler: {(response: NSURLResponse!,
            data: NSData!,
            error: NSError!) in
            if data.length > 0 && error == nil{
                let json = NSString(data: data, encoding: NSASCIIStringEncoding)
                self.extract_json(json!)
            }else if data.length == 0 && error == nil{
                println("Nothing was downloaded")
            } else if error != nil{
                println("Error happened = \(error)")
            }
        }
    )
}
func extract_json(data:NSString)
{
    var parseError: NSError?
    let jsonData:NSData? = data.dataUsingEncoding(NSASCIIStringEncoding)!
    let json: AnyObject? = NSJSONSerialization.JSONObjectWithData(jsonData!, options: nil, error: &parseError)
    if (parseError == nil)
    {
        if let countries_list = json as? NSArray
        {
            for (var i = 0; i < countries_list.count ; i++ )
            {
                if let country_obj = countries_list[i] as? NSDictionary
                {
                    if let country_name = country_obj["country"] as? String
                    {
                        if let country_code = country_obj["code"] as? String
                        {
                            TableData.append(country_name + " [" + country_code + "]")
                        }
                    }
                }
            }
        }
    }

   do_table_refresh();

}
func do_table_refresh()
{
    self.tableView.reloadData()
}

2 个答案:

答案 0 :(得分:0)

确定。你得到的例外是因为你的tableView在viewdidLoad之后是nil。这可能是一个连接问题,所以首先尝试这个答案: IBOutlet UITableView is null after View did load

其次,如果你的所有笔尖都是正确的,你仍然会看到这个错误。然后尝试以下代码。 [根据需要放置tableview框架]。这可以完成您想要以编程方式执行的所有操作。

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    var TableData:Array< String > = Array < String >()

    var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        get_data_from_url("http://www.kaleidosblog.com/tutorial/tutorial.json")

        tableView = UITableView(frame: self.view.frame)
        title = "title"
        var menuImage:UIImage = UIImage(named: "sidebtn")!
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "1", style: .Plain, target: self, action: "presentLeftMenuViewController")
        menuImage = menuImage.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
        self.navigationItem.leftBarButtonItem?.image = menuImage
        self.view.addSubView(tableView)


        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return TableData.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
        cell.textLabel?.text = TableData[indexPath.row]
        return cell
    }
    func get_data_from_url(url:String)
    {
        let httpMethod = "GET"
        let timeout = 15
        let url = NSURL(string: url)
        let urlRequest = NSMutableURLRequest(URL: url!,
            cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData,
            timeoutInterval: 15.0)
        let queue = NSOperationQueue()
        NSURLConnection.sendAsynchronousRequest(
            urlRequest,
            queue: queue,
            completionHandler: {(response: NSURLResponse!,
                data: NSData!,
                error: NSError!) in
                if data.length > 0 && error == nil{
                    let json = NSString(data: data, encoding: NSASCIIStringEncoding)
                    self.extract_json(json!)
                }else if data.length == 0 && error == nil{
                    println("Nothing was downloaded")
                } else if error != nil{
                    println("Error happened = \(error)")
                }
            }
        )
    }
    func extract_json(data:NSString)
    {
        var parseError: NSError?
        let jsonData:NSData? = data.dataUsingEncoding(NSASCIIStringEncoding)!
        let json: AnyObject? = NSJSONSerialization.JSONObjectWithData(jsonData!, options: nil, error: &parseError)
        if (parseError == nil)
        {
            if let countries_list = json as? NSArray
            {
                for (var i = 0; i < countries_list.count ; i++ )
                {
                    if let country_obj = countries_list[i] as? NSDictionary
                    {
                        if let country_name = country_obj["country"] as? String
                        {
                            if let country_code = country_obj["code"] as? String
                            {
                                TableData.append(country_name + " [" + country_code + "]")
                            }
                        }
                    }
                }
            }
        }

        do_table_refresh();

    }
    func do_table_refresh()
    {
        self.tableView.reloadData()
    }
}

答案 1 :(得分:0)

在故事板中,找到你的tableviewcontroller,然后右键单击tableview查看引用插座,在引用插座下有很大机会,你定义的tableview变量与你在代码中定义的变量不同。

然后你只需要删除tableview的引用出口,同时删除代码&#34; var tableView:UITableView!&#34;,然后重新控制将tableview拖到你的代码中以进行新的引用。出于这个原因,它曾经发生在我身上。