在我的应用程序中,我调用了Json函数,并且视图中的表视图委托和数据源方法已经加载但是这里没有从Web服务加载数据它调用表视图方法,并且由于没有来自模型的数据而导致内部崩溃任何人都可以帮我解决这个问题,这种情况有时会发生,有时它会正常工作吗?
这是我的观点加载
let guestAddressURL = "http://magento.selldesk.io/index.php/rest/V1/guest-carts/\(guestkey!)/billing-address"
self.guestShippingaddressURL(guestAddressApi: guestAddressURL)
self.tableDetails.delegate = self
self.tableDetails.dataSource = self
self.tableDetails.tableFooterView?.isHidden = true
self.tableDetails.separatorInset = UIEdgeInsets.zero
self.tableDetails.rowHeight = UITableViewAutomaticDimension
self.tableDetails.estimatedRowHeight = 50
self.title = "Checkout"
这是我的Json功能
func guestShippingaddressURL(guestAddressApi: String) {
print(guestAddressApi)
let url = URL(string: guestAddressApi)
var request = URLRequest(url: url! as URL)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if error != nil { print(error!); return }
do {
if let jsonObj = try JSONSerialization.jsonObject(with: data!) as? [String:Any] {
let obj = jsonObj["street"] as! [String]
for item in obj {
self.street = item
}
print(obj)
print(self.street)
self.guestShippingAddressModel = GuestAddress.init(dict: jsonObj)
if self.street?.isEmpty == false {
self.addressSelected = true
self.selected = false
}
DispatchQueue.main.async {
self.tableDetails.reloadData()
}
}
} catch {
print(error)
}
}
task.resume()
}
func numberOfSections(in tableView: UITableView) -> Int {
if self.street?.isEmpty == false{
return 3
}
else {
if ((addressSelected == true || checkIsPaymentRadioSelect == true) && selected == false) {
return 3
}else {
return 2
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
if ((addressSelected == true || checkIsPaymentRadioSelect == true) && selected == false) {
if (section == 0)
{
return 1
}
else if (section == 1)
{
return 1
}
else
{
return 1
}
}
else
{
if (section == 0)
{
return 1
}
else
{
return 1
}
}
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if ((addressSelected == true || checkIsPaymentRadioSelect == true) && selected == false){
if (indexPath.section == 0) {
return UITableViewAutomaticDimension
}
else if (indexPath.section == 1) {
return 62
}
else {
if height == 0 {
return CGFloat(heightStart)
}
else{
return CGFloat(self.height)
}
}
}
else{
if (indexPath.section == 0){
if self.street?.isEmpty == true{
return 50
}else {
return UITableViewAutomaticDimension
}
}
else if (indexPath.section == 1){
return 62
}
else {
return 0
}
}
}
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){
let header = view as! UITableViewHeaderFooterView
header.textLabel?.textColor = UIColor.gray
header.textLabel?.textAlignment = NSTextAlignment.center
header.textLabel?.font = UIFont(name: "Futura", size: 17)
}
答案 0 :(得分:1)
tableview将开始加载您的JSON调用是否已完成。这在viewDidLoad完成后自动发生..它不会等待完成处理程序中的reloadData()调用。
因此,您需要设置numberOfSections以返回0,直到数据加载完毕。这样,在完成处理程序将数据放入并调用reloadData()之前,您的表将为空(并且甚至不会调用cellForRow)。此时,您的numberOfSections将返回非零值,您的数据将会显示。
答案 1 :(得分:0)
您应该使用一些默认值初始化表视图方法中使用的所有变量。
赞:var street: String! = ""
,var addressSelected: Bool! = false
等。
因为即使在调用API之前,其中一些值为nil
或未设置。
对于cell.nameLabel.text = "\((dict?.firstName)!) \
,您可以return 0
方法中numberOfRows
。
guard let _ = dict {
return 0
}
答案 2 :(得分:0)
您可以通过在Web服务回调中设置Delegate和DataSource来实现。
DispatchQueue.main.async {
self.tableDetails.delegate = self
self.tableDetails.dataSource = self
self.tableDetails.reloadData()
}
希望它有效。