Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITableView加载数据_Ios_Json_Swift_Uitableview_Tableview - Fatal编程技术网

Ios UITableView加载数据

Ios UITableView加载数据,ios,json,swift,uitableview,tableview,Ios,Json,Swift,Uitableview,Tableview,我正在尝试在我的应用程序中填充tableview,但我不知道如何创建一个函数来开始填充它。我之所以想这样做,是因为我从http请求接收数据,但当需要更新tableview数据源时,将包含它的数组是空的。 可能吗?我用的是斯威夫特 这是我的代码: class ContractsViewController: UIViewController, UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource { var company

我正在尝试在我的应用程序中填充tableview,但我不知道如何创建一个函数来开始填充它。我之所以想这样做,是因为我从http请求接收数据,但当需要更新tableview数据源时,将包含它的数组是空的。 可能吗?我用的是斯威夫特

这是我的代码:

class ContractsViewController: UIViewController, UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource {

var companyTxt: String = ""
var descriptionTxt: String = ""
var idTxt: String = ""
var dateCreatedTxt: String = ""
var dateExpirationTxt: String = ""
var savedData = Dictionary<Int, JSON>()
var json: JSON = []


@IBOutlet weak var searchContracts: UISearchBar!
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var myIndicator: UIActivityIndicatorView!


override func viewDidLoad() {
    super.viewDidLoad()

    preUpload()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func preUpload() {

    let headers = [
        "X-Limit": "5",
        "X-Sort": "{\"expirationDate\":-1}"
    ]


    myIndicator.color = (UIColor.redColor())
    myIndicator.startAnimating()


    Async.background {

        Alamofire.request(.GET, "https://mydata", headers: headers)
            .responseJSON { response in
                switch response.result {
                case .Success (let data):

                    self.json = JSON(data)

                    let replaced = FindAndReplace().findAndReplace(self.json)

                    for (pos, object): (String, JSON) in replaced {
                        print("")
                        print("pos -> " + pos)
                        self.savedData[Int(pos)!] = object
                    }

                case .Failure(let error):
                    print(error)
                }
        }

        }.main {

            self.myIndicator.stopAnimating()

    }


}


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    self.searchContracts.resignFirstResponder()
}


// MARK: TableView


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    //return name.count
    print("Json count -> " + String(json.count))
    return json.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell: ServiceContractsCell? =  tableView.dequeueReusableCellWithIdentifier("cellServiceContracts", forIndexPath: indexPath) as? ServiceContractsCell

    let value = self.savedData[(indexPath.row)]
    let valueMapped = Mapper<ServiceContract>().map(String(value))

    cell?.descriptionText.text = valueMapped?.description



    return cell!
}

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool
{
    return false
}

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)
{
    self.tableView?.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)

}

func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle
{
    return (UITableViewCellEditingStyle.Delete)
}

func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool
{
    return true
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
    print("row = %d",indexPath.row)

}



}
提前谢谢

编辑
我无法在viewDidLoad中使用reloadData和self.tableView.delegate/datasource在Alamo调用下,将主闭包更新为:

}.main {
self.myIndicator.stopAnimating()
self.tableView.reloadData()
}

在评论中,您提到如果尝试重新加载数据,则会出现nil异常。确保tableView已连接到IBOutlet。然后确保你的视图中有这个

tableView.delegate = self
tableView.dataSource = self
在那之后,你应该可以打电话

tableView.reloadData()

从主线程开始

所有的UI更新都应该只在主线程中,您可以调用tableView.reloadData,如下所示吗

dispatch_async(dispatch_get_main_queue()) { () -> Void in
        self.tableView.reloadData()
   }

一旦获得并解析JSON数据,您需要调用tableView.reloadData。正如Larme在这里所述,您需要调用reloadData以使表视图显示新值。我应该在.main中使用reloadData吗?因为如果我尝试此方法,我会出现零异常我找不到reloadTable,只有reloadData,但是如果我尝试使用该方法,我会出现零异常我会在情节提要中匹配并委派,现在我在viewDidLoad中添加了两行,我尝试在.main中调用tableView.reloadData,但我仍然存在零异常,无论如何,谢谢