在我当前的项目中,我正在尝试从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
如您所见:通过将dataSource
和delegate
设置为我的班级,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.
感谢大家的回答。我发现了这个问题。我通过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。
答案 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