2015-12-02 20 views
9

Tôi đang sử dụng AlamofireImage để thiết lập một hình ảnh trên một UIImageView trong một UITableViewCell như vậy:AlamofireImage af_setImageWithURL trong một UITableViewCell mà không ảnh giữ chỗ

cell.imageView.af_setImageWithURL(url)

Hình ảnh không hiển thị sau khi tải về. Nó sẽ hiển thị hình ảnh lần thứ hai khi nó được tải từ bộ nhớ cache.

Dường như việc sử dụng hình ảnh trình giữ chỗ sẽ tạo ra tất cả sự khác biệt.

này hoạt động và in địa chỉ của hình ảnh (tải về):

cell.imageView.af_setImageWithURL(URL, placeholderImage: UIImage(named: "placeholder"), filter: nil, imageTransition: .None, completion: { (response) -> Void in 
        print("image: \(cell.imageView.image)") 
       }) 

này không hoạt động và in "hình ảnh: nil"

cell.imageView.af_setImageWithURL(URL, placeholderImage: nil, filter: nil, imageTransition: .None, completion: { (response) -> Void in 
        print("image: \(self.image)") 
       }) 

Nó cũng hoạt động khi thiết lập các tế bào imageXem hình ảnh trống trước khi thực hiện af_setImageWithURL:

cell.imageView.image = UIImage()

Đây có phải là lỗi trong UITableViewCell, AlamofireImage hoặc tôi đang làm điều gì sai?

+0

Dường như kích thước cell.imageView tương ứng, tùy thuộc vào việc có hình ảnh hay không. Nếu không có hình ảnh, nó co lại khung của nó để không có không gian. Vì vậy, khi bạn không sử dụng một trình giữ chỗ, nó nghĩ rằng không có hình ảnh, do đó co lại chính nó. Sau đó, khi hình ảnh đến không đồng bộ, khung hình đã bị thu hẹp, do đó không có nơi nào để đặt hình ảnh. – Harris

Trả lời

1

Bạn có thể in lỗi bằng cách thêm 2 dòng mã để bạn sẽ nhận được nhiều ý tưởng hơn về vấn đề này.

cell.imageView.af_setImageWithURL(URL, placeholderImage: UIImage(named: "placeholder"), filter: nil, imageTransition: .None, completion: { (response) -> Void in 
        print("image: \(cell.imageView.image)") 
        print(response.result.value) //# UIImage 
        print(response.result.error) //# NSError 

       }) 

Trong trường hợp của tôi đã xảy ra sự cố với URL hình ảnh. Nó đang tải hình ảnh khi tôi mở nó trong trình duyệt.

1

Câu hỏi này được vài tuổi, nhưng có lẽ câu trả lời này có thể hữu ích cho người khác có vấn đề tương tự, như tôi trước đây để tìm ra giải pháp đúng.

Vì hình ảnh được tải không đồng bộ, nếu chúng tôi không cung cấp chiều cao cố định cho UIIMageView , chúng tôi buộc phải cập nhật ô khi tải xuống hoàn tất. Điều này vì việc cập nhật ô (tức là tính toán lại tính toán tự động) được thực hiện tự động chỉ sau phương thức cellForRowAt, được gọi khi lần đầu tiên ô được hiển thị hoặc khi bảng được cuộn để hiển thị các ô khác. Trong cả hai trường hợp, có lẽ các hình ảnh chưa được tải xuống theo phương thức af_setImage(), do đó không có gì ngoài trình giữ chỗ sẽ được hiển thị vì các kích thước của chúng chưa được xác định cho thời điểm này.

Để bắt buộc cập nhật ô, chúng tôi cần sử dụng phương pháp beginUpdates()endUpdates(), đặt chúng bên trong trình xử lý hoàn thành .af_setImage(). Bằng cách này, mỗi lần tải xuống hoàn tất, ô sẽ được cập nhật.

Tuy nhiên, để tránh một vòng lặp, trước khi gọi beginUpdates()/endUpdates() chúng ta phải kiểm tra xem chúng tôi đã cập nhật các tế bào trước, bởi vì bằng cách gọi phương pháp này, phương pháp cellForRowAt được gọi là một lần nữa và do đó af_setImage() và nó hoàn thành đóng cửa với beginUpdates()/endUpdates() bên trong nó).

Điều này có nghĩa là chúng tôi chỉ cập nhật ô khi quá trình tải xuống hoàn tất và không phải khi hình ảnh đã được đổi thành tiền mặt (bởi vì, nếu được đổi thành tiền mặt, có nghĩa là chúng tôi đã cập nhật ô).Điều này có thể được thực hiện bằng cách kiểm tra đáp ứng của trình xử lý hoàn thành: nếu nó không phải là nil, hình ảnh chỉ bị downoladed, nếu nó là nil, hình ảnh đã được đổi thành tiền mặt.

Là một bên có lợi cho chiều cao di động sẽ được điều chỉnh Automagically (nhớ để đặt tableView.estimatedRowHeight = 400tableView.rowHeight = UITableViewAutomaticDimension trong phương pháp viewDidLoad() của bạn)

Cuối cùng, ở đây nó là mã:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     // Dequeue your cell 
     let cell = self.tableView.dequeueReusableCell(withIdentifier: "YourCustomCellIdentifier") as! YourCustomTableViewCell 

     // get picture url from the data array 
     let pictureUrl = self.yourCellsData[indexPath.row].pictureUrl 

     // async download 
     cell.pictureView.af_setImage(
       withURL: URL(string: pictureUrl)!, 
       placeholderImage: UIImage(named: "YourPlaceholder.png"), 
       filter: nil, 
       imageTransition: UIImageView.ImageTransition.crossDissolve(0.5), 
       runImageTransitionIfCached: false) { 
        // Completion closure 
        response in 
         // Check if the image isn't already cached 
         if response.response != nil { 
          // Force the cell update 
          self.tableView.beginUpdates() 
          self.tableView.endUpdates() 
         } 
       } 

     return cell 
     } 

Đó là tất cả các folks! ;-)

+0

Hi Guido, mã này hoạt động rất tốt! Thật không may nó có một vấn đề lớn: khi di chuyển, bảng được thiết kế lại và cuộn lên và xuống, nó là một trải nghiệm rất giường cho người dùng. Điều này có xảy ra với tôi không? –

+0

Xin chào Francesco, tôi không nhớ có sự cố tương tự, bạn có thể đăng dự án mẫu hiển thị vấn đề này không? – Guido

+0

Hi Guido, tôi đã khắc phục sự cố của mình bằng cách đánh giá chiều cao ô bên phải và bằng cách tạo các ô mới có giá trị cố định. Tôi không còn mã bị hỏng nữa, tôi xin lỗi. Tôi sẽ cố gắng tái sản xuất, nếu tôi tìm cách để thực tế có vấn đề tôi sẽ đăng ở đây một lần nữa. Cảm ơn bạn! –

Các vấn đề liên quan