在reloadData之后没有调用cellForRowAtIndexPath但是numberOfRowsInSection没有调用

时间:2016-08-04 09:30:08

标签: ios swift uitableview

在我当前的项目中,我正在尝试从REST-Endpoint获取新闻,并且我想在网络请求完成后刷新reloadData()。所以我致电cellForRowAtIndexPath,但遗憾的是numberOfRowsInSection未被调用,但class NewsTableViewController: UIViewController { private var newsItems: Array<NewsItem>! private var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() newsItems = [] addDummyItem() prepareTableView() getNews() } func addDummyItem(){ let newsItem = NewsItem() newsItem.dateString = "12th May" newsItem.title = "Lorem ipsum" newsItem.imgUrl = "URL" newsItem.url = "URL" newsItem.message = "Lorem ipsum dolor sit amet" self.newsItems.append(newsItem) } func getNews(){ let url = NSURL(string: "http://someurl.com/news") let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: url!) let session = NSURLSession.sharedSession() let task = session.dataTaskWithRequest(urlRequest) { data, response, error in guard data != nil && error == nil else { print(error) return } guard let httpResponse = response as? NSHTTPURLResponse where httpResponse.statusCode == 200 else { print("status code not 200; \(response)") return } let json = String(data:data!, encoding: NSISOLatin1StringEncoding) let arr: AnyObject? = json?.parseJSONString for item in arr as! Array<AnyObject>{ let newsItem = NewsItem() newsItem.dateString = (item["dateString"] as AnyObject? as? String) ?? "" newsItem.title = (item["title"] as AnyObject? as? String) ?? "" newsItem.imgUrl = (item["imgUrl"] as AnyObject? as? String) ?? "" newsItem.url = (item["url"] as AnyObject? as? String) ?? "" newsItem.message = (item["message"] as AnyObject? as? String) ?? "" self.newsItems.append(newsItem) } print("Network request finished - call reloadData()") dispatch_async(dispatch_get_main_queue(), { self.tableView.reloadData() }) } task.resume() } override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) automaticallyAdjustsScrollViewInsets = false } private func prepareTableView() { tableView = UITableView() tableView.dataSource = self tableView.delegate = self tableView.separatorColor = UIColor.clearColor() } } extension NewsTableViewController : UITableViewDataSource{ func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { print("Item count: ", newsItems.count) return newsItems.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { print("cellForRowAtIndexPath called with indexPathRow: ", indexPath.row) let cell = tableView.dequeueReusableCellWithIdentifier("ImageCardViewCell") as! NewsImageCardViewCell let item: NewsItem = newsItems[indexPath.row] getImageCardView(item.url, btnDate: item.dateString, textTitle: item.title, textDetail: item.message, imageCardView: cell.imageCardView, imageName: "news_1", indexPath: indexPath) return cell } } extension NewsTableViewController : UITableViewDelegate{ func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { tableView.deselectRowAtIndexPath(indexPath, animated: true) } } 被调用并返回正确数量的项目。

将我的代码剥离到相关部分:

UITableView

如您所见:通过将dataSourcedelegate设置为我的班级,reloadData()已正确设置。在主线程上调用Item count: 1 cellForRowAtIndexPath called with indexPathRow: 0 Network request finished - call reloadData() Item count: 72 方法。在日志输出之后:

cellForRowAtIndexPath

注意:首先,我的数组中有一个虚拟项目只是为了向您显示reloadData()确实被调用但只有一次。在numberOfRowsInSection上触发UITableView后,调用但不是cellForRowAtIndexPath方法。

我知道有很多类似的问题,我已经检查了所有可能的解决方案,但没有一个正常。我感谢任何帮助。

修改

请注意,在网络请求之前添加的虚拟视图是可见的。所以ViewController s'的高度不是0.

编辑#2

感谢大家的回答。我发现了这个问题。我通过Storyboard实例化IBOutlet,但我错过了设置UITableView。由于我df1 <- data.frame(df$col1, df$freq1) colnames(df1) <- c("fruit", "freq") df2 <- data.frame(df$col2, df$freq2) colnames(df2) <- c("fruit", "freq") df3 <- data.frame(df$col3, df$freq3) colnames(df3) <- c("fruit", "freq") 的界限是0,0,0,0。

3 个答案:

答案 0 :(得分:4)

检查以下内容:

1 numberOfRowsInSection查看返回值

2如果调用step1并且返回右值仍然没有调用cellForRowAtIndexPath这意味着你的表视图高度小于单元格或表视图高度的高度为0,打印tableview边界并检查tableview的superview有剪辑限制为TRUE

答案 1 :(得分:2)

因为你的表视图没有添加到你的窗口,如果表视图不可见,UIKit将不会处理与UI相关的方法。这是Apple的lazy load 更改您的prepareTableView功能,如下所示:

private func prepareTableView() {
    tableView = UITableView(frame: self.view.bounds, style: .Plain)
    tableView.dataSource = self
    tableView.delegate = self
    tableView.separatorColor = UIColor.clearColor()
    self.view.addSubview(tableView)
}

答案 2 :(得分:1)

tableview数据源方法cellForRowAtIndexPath取决于numberOfRowsInSection。因此,newsItems

中的零项可能是可能的