Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS Swift自定义单元格函数_Ios_Swift_Uitableview - Fatal编程技术网

iOS Swift自定义单元格函数

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

我有一个TableView和自定义单元格。在我的自定义单元格中,我有以下功能:

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:(