数组未与 tableView(numberOfRowsInSection) 方法连接

Posted

技术标签:

【中文标题】数组未与 tableView(numberOfRowsInSection) 方法连接【英文标题】:Array does not connect with the tableView(numberOfRowsInSection) method 【发布时间】: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 调用中得到了更新,但是“请求后”一直打印空数组,我不确定这里发生了什么。

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

提前致谢。

【问题讨论】:

【参考方案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 函数打印一个空数组。 检查您的控制台,您的数组值是否显示为字符串。在您的值以字符串形式显示之前,您的数组为空。需要将字符串转换为数组。那么您的数组值不会显示为空。有什么问题可以告诉我控制台输出吗?

以上是关于数组未与 tableView(numberOfRowsInSection) 方法连接的主要内容,如果未能解决你的问题,请参考以下文章

UITableView - 核心数据应用程序中的表视图崩溃,因为删除后行数无效

SKPhysicsBody 未与 SKShapeNode 对齐

片段 XXX 未与片段管理器关联

CKEditor 未与 easyadmin 集成显示

颤振行未与左侧对齐

Textarea 值未与表单一起发布