【问题标题】:Array does not connect with the tableView(numberOfRowsInSection) method数组未与 tableView(numberOfRowsInSection) 方法连接
【发布时间】:2017-03-30 00:04:00
【问题描述】:

所以我有一个数组,我将存储从 http 请求获得的所有数据并将它们显示在 tableView 上,但似乎 tableView(numberOfRowsInSection) 无法识别数组中的更改,因为计数保持为 0。

class OrdersViewController: UIViewController {


    @IBOutlet weak var tableView: UITableView!

    var arr = [[String: AnyObject]]()
    var selectedIndex = -1

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        let baseUrl = "my url"
        let consumer_key = "consumer_key"
        let consumer_secret = "consumer_key"
        let url = "\(baseUrl)?consumer_key=\(consumer_key)&consumer_secret=\(consumer_secret)&status=processing"

        let headers2 = ["Accept": "application/json"]
        Alamofire.request(url, headers: headers2)
            .responseJSON { response in

                    self.arr.append(data from request)

                }
        }

        let url2 = "\(baseUrl)?consumer_key=\(consumer_key)&consumer_secret=\(consumer_secret)&status=pending"
        Alamofire.request(url2, headers: headers2)
            .responseJSON { response in

                    self.arr.append(data from request)

                    print("arr", self.arr)
                }
        }
    }

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

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        print("after request", self.arr)
        return self.arr.count
    }
}
and some other codes...

我确实从 http 请求中成功获取了数据,并且它在我的 Alamofire 调用中得到了更新,但是“请求后”一直打印空数组,我不确定这里发生了什么。

如果有人能提出任何可以改变我思维过程的建议,我们将不胜感激。

提前致谢。

【问题讨论】:

    标签: swift http alamofire


    【解决方案1】:

    您需要在更改self.arr 属性后调用tableView.reloadData()。对应的documentation 提供了更多详细信息:

    调用此方法重新加载所有用于构造表格的数据,包括单元格、节页眉和页脚、索引数组等。为了提高效率,表格视图只重新显示那些可见的行。

    如果您计划在很多地方更改您的 self.arr 属性,您也可以添加一个 属性观察者

    var arr = [[String: AnyObject]]() {
        didSet { tableView?.reloadData() } 
    }
    

    ...所以你不需要复制和粘贴相同的代码;-)

    【讨论】:

    • 我把 self.tableView.reloadData() 放在 append 方法之后,但它仍然没有在 numberOfRowsInSection 函数中更新我的数组。此外,现在它给了我一个错误,说Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:]Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (<UITableView: 0x7fc0e80fe600; frame = (0 20; 375 598);.....。谢谢你的帮助。也许我的问题是别的。
    • @ckim16 欢迎您!看起来您可能还有其他问题,但不调用 reloadData() 也绝对是一个错误。
    【解决方案2】:

    我建议您将您的请求和响应逻辑移动到一个函数中,然后从 viewDidAppear 而不是 viewDidLoad 调用该函数,并在调用之后使用 reloadData() 重新加载您的表格视图

    【讨论】:

      【解决方案3】:

      在 Viewdidload 中使用此代码

      dispatch_async(dispatch_get_main_queue()) {
      self.tableView.reloadData()
       } 
      

      而不是

      tableView.reloadData()
      

      【讨论】:

      • 这仍然为我的 numberOfRowInSection 函数打印一个空数组。
      • 检查您的控制台,您的数组值是否显示为字符串。在您的值以字符串形式显示之前,您的数组为空。需要将字符串转换为数组。那么您的数组值不会显示为空。有什么问题可以告诉我控制台输出吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多