iOS Swift自定义单元格功能

时间:2016-08-31 10:33:49

标签: 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 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)再次运行。我希望一次发送此请求,并在视图加载时发送。

我的问题在哪里?

P.S我尝试使用此

在自定义单元格中加载我的URLRequest
override init()

但我无法将bookId值从tableview传递到自定义单元格并返回nil。

感谢

3 个答案:

答案 0 :(得分:2)

您正面临的问题正在发生,因为表格视图单元格被表格视图重复使用。这意味着操作系统只在内存中保留很少的单元格,但是当您滚动时,它会在视图中移动它们。

无论如何,有两种方法可以解决这个问题:

第一个涉及在表视图控制器中使用书信息(使用字典或数组),当您初始化单元格时,只需在单元格中设置属性即可。的优选

第二个是将当前bookId存储在单元格中,如果单元格当前正在显示该书籍ID,则返回。 不建议这样做。

请记住,单元格不是控制器,它应该只用于存储数据和修改视图。所有逻辑都应该在表视图控制器中。

答案 1 :(得分:1)

问题是你试图在你的手机中加载它。每次当您滚动到新单元格时,cellForRowAtIndexPath都会再次呼叫您的URLRequest。 你真正需要做的是,之前预先加载你的数据。换句话说,您必须在viewDidLoad(或特定模型类)中的viewController上的某处执行请求,将结果存储在数组(或任何其他集合类型)中,然后将静态数据传递到细胞。 在UITableViewCell子类内调用网络请求将导致内存和流量使用效率低下。

答案 2 :(得分:0)

将table.dequeReusableCellWithIdentifier放在if条件

旁边

并像这样写

ul ul li:first