iOS Swift自定义单元格函数
我有一个TableView和自定义单元格。在我的自定义单元格中,我有以下功能:iOS Swift自定义单元格函数,ios,swift,uitableview,Ios,Swift,Uitableview,我有一个TableView和自定义单元格。在我的自定义单元格中,我有以下功能: func URLRequest(bookId : String) { let headers = [ "Authorization": "Bearer", "Accept": "application/json" ] let url = "http://example.com/api/v1/books/\(bookId)/related" let
func URLRequest(bookId : String) {
let headers = [
"Authorization": "Bearer",
"Accept": "application/json"
]
let url = "http://example.com/api/v1/books/\(bookId)/related"
let URLRequest = NSMutableURLRequest(URL: NSURL(string: url)!)
URLRequest.cachePolicy = NSURLRequestCachePolicy.ReturnCacheDataElseLoad
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
Alamofire.request(.GET, url, headers:headers)
.validate()
.responseJSON { response in
switch response.result {
case .Success:
if let jsonData = response.result.value {
dispatch_async(dispatch_get_main_queue(), {
print("Custom Cell")
return
})
self.tableRefresh()
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
}
case .Failure(let error):
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
print(error)
}
}
}
我在tableView中运行此函数:
if indexPath.row == 4 {
let cell = tableView.dequeueReusableCellWithIdentifier("relatedCell", forIndexPath: indexPath) as! RelatedBookTableViewCell
cell.URLRequest(self.bookID)
return cell
}
但问题是每次我滚动表视图时,这个请求(URLRequest)都会再次运行。我想在视图加载时发送此请求一次
我的问题在哪里
另外,我尝试在自定义单元格中加载我的URLRequest
override init()
但我无法将bookId值从tableview传递到自定义单元格并返回nil
谢谢问题是您正试图将其加载到手机中。每次滚动到新单元格时,
cellforrowatinexpath
都会再次调用您的URLRequest
。
您真正需要做的是在开始之前预加载数据。换句话说,您必须在viewController
中的viewDidLoad
上的某个位置执行请求(或在特定的模型类中),将结果存储在数组(或任何其他集合类型)中,然后将静态数据传递到单元格中。
在
UITableViewCell
子类中调用网络请求将导致内存和通信量使用效率低下。您面临的问题是因为表视图单元格被表视图重用。这意味着操作系统在内存中只保留很少的单元格,但当你滚动时,它会在视图中移动它们
无论如何,有两种方法可以解决这个问题:
第一种方法是将书籍信息放在表视图控制器中(使用字典或数组),在初始化单元格时,只需在单元格中设置属性首选
第二个是将当前bookId存储在单元格中,如果单元格当前正在显示该bookId,只需返回即可不建议这样做。
请记住,单元格不是控制器,它只能用于存储数据和修改视图。所有逻辑都应该在表视图控制器中。将table.dequeryusablewithidentifier置于if条件之外 然后像这样写
let cell = tableView.dequeueReusableCellWithIdentifier("relatedCell", forIndexPath: indexPath) as! RelatedBookTableViewCell
if indexPath.row == 4 {
cell.URLRequest(self.bookID)
}
return cell
亲爱的@Sealos我尝试在XPath中使用cell.bookId=self.ID,但返回nil for meI不知道您的表是如何构造的,但是您需要在表视图控制器上预取图书信息,当您拥有所有这些信息时,您可以继续显示包含相应单元格的表。我使用Alamofire从API获取数据,然后尝试在dispatch_async(dispatch_get_main_queue())中重新加载表视图数据,是否正确?听起来正确。我相信您不需要这样做,因为除非另有说明,否则Alamofire响应将在主线程中运行。但仍然为我返回nil:(