3

Ich habe eine Menge Probleme beim Laden eines CustomImageView: UIImageView in einem Detail viewController basierend auf dem selectedIndexPath einer collectionViewCell. Ich habe die UILabels und UITextViews erfolgreich übergeben und geladen, bin aber nicht in der Lage, CustomImageView: UIImageView von demselben selectedIndexPath mit derselben Prozess- und Codelogik zu laden. Ich glaube, es hat etwas damit zu tun, meinen Image-Cache zu löschen oder zurückzusetzen, aber ich bin mir nicht sicher, wo oder was genau ausgeführt werden soll. Entschuldigung für überschüssigen Code, möchte nur gründlich sein. Danke für jede Hilfe oder Anweisung!load selectedIndexItem in neue collectionViewCell (invalidate imageCache)

// Modellobjektklassen Werte von Firebase

class CurrentPlanner: SafeJsonObjectPlanner { 

    var name: String? 
    var profileImageUrl: String? 
    var planningPlace: String? 

    init(dictionary: [String: AnyObject]) { 
     self.name = dictionary["addedBy"] as? String 
     self.profileImageUrl = dictionary["profileImageUrl"] as? String 
     self.planningPlace = dictionary["planning"] as? String 
    } 
} 

// CustomImageView Speicherung: UIImageView Erweiterung, die den ersten collectionViewController

let imageCache = NSCache<NSString, UIImage>() 

class CustomImageView: UIImageView { 

    var imageUrlString: String? 

    func loadImageUsingUrlString(_ urlString: String) { 

     imageUrlString = urlString 
     let url = URL(string: urlString) 
     image = nil 

     if let imageFromCache = imageCache.object(forKey: urlString as NSString) { 
      self.image = imageFromCache 
      return 
     } 

     URLSession.shared.dataTask(with: url!, completionHandler: { (data, respones, error) in 

      if error != nil { 
       print(error!) 
       return 
      } 

      DispatchQueue.main.async(execute: { 
       let imageToCache = UIImage(data: data!) 
       if self.imageUrlString == urlString { 
        self.image = imageToCache 
       } 
       imageCache.setObject(imageToCache!, forKey: urlString as NSString) 
      }) 
     }).resume() 
    } 
} 

extension UIImageView { 
    func loadImageUsingCacheWithUrlString(_ urlString: String) { 
     self.image = nil 

     //check cache for image first 
     if let cachedImage = imageCache.object(forKey: urlString as NSString) { 
      self.image = cachedImage 
      return 
     } 

     //otherwise fire off a new download 
     let url = URL(string: urlString) 
     URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in 

      //download hit an error so lets return out 
      if let error = error { 
       print(error) 
       return 
      } 

      DispatchQueue.main.async(execute: { 
       if let downloadedImage = UIImage(data: data!) { 
        imageCache.setObject(downloadedImage, forKey: urlString as NSString) 
        self.image = downloadedImage 
       } 
      }) 
     }).resume() 
    } 
} 

// Planung Zellklasse im ersten Kollektion

auffüllt
class BasePlanningCell: BaseCell2 { 

    var currentPlanners = [CurrentPlanner]() 

    var currentPlanner: CurrentPlanner? { 
     didSet { 
      setupProfileImage() 
     } 
    } 

    fileprivate func setupProfileImage() { 
     if let profileImageUrl = currentPlanner?.profileImageUrl {   
userProfileImageView.loadImageUsingCacheWithUrlString(profileImageUrl) 
     } 
    } 

// angeklopfte Zellklasse in erster Collecti OnView - rufen Delegatmethode

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     print("cell tapped") 
     // cell delegate method called from collectionViewController 
     travelersFeedVC?.showPlanningViewDetailView(indexPath: indexPath) 
    } 

// erste collectionViewController Klasse - Verfahren auf Zell Hahn durchgeführt

func showPlanningViewDetailView(indexPath: IndexPath) { 
     let plannersDetailVC = PlanningPlaceDetailsVC() 

     plannersDetailVC.profileImageUrl = plannedPlaces[indexPath.row].profileImageUrl! 
     print(plannersDetailVC.profileImageUrl!) 

     show(plannersDetailVC, sender: self) 
    } 

// 2. DetailViewController Klasse

var nameString: String! 
    var locationString: String! 
    var profileImageUrl: String! 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     switch indexPath.item { 
     case 0: 
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PlanningDetailViewCells", for: indexPath) as! PlanningDetailViewCells 
      cell.myMethod(str: nameString) 
      cell.getLocationMethod(str: locationString) 
      cell.getProfileImageMethod(str: profileImageUrl) 
      return cell 
     case 1: 
      // ... 
     case 2: 
      // ... 
     default: 
      // ... 
     } 
    } 

// 2. DetailViewControllers Cells Delegate Klasse

func myMethod(str : String){ 
     nameString = str 
     print("var : \(nameString)") 
     planningCellHeader?.titleLabel.text = nameString 
    } 

    func getLocationMethod(str : String){ 
     locationString = str 
     print("var : \(String(describing: locationString))") 
     planningCellHeader?.locationTextView.text = locationString 
    } 

    func getProfileImageMethod(str : String){ 
     profileImageUrl = str 
     print("var : \(String(describing: profileImageUrl))") 
     planningCellHeader?.userProfileImageView.imageUrlString = profileImageUrl 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     switch indexPath.section { 
     case 0: 
      switch indexPath.item { 
      case 0: 
       let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "headerId", for: indexPath) as! PlanningCellHeader     
       cell.myMethod(str: nameString) 
       cell.getLocationMethod(str: locationString) 
       cell.getProfileImageMethod(str: profileImageUrl) 
       return cell 
      case 1: 
       // ... 
      default: 
       // ... 
      } 
     default: 
      // ... 
     } 
    } 

// headerCell Klasse, die die Ansichten

var nameString: String? 
var locationString: String? 
var profileImageUrl: String? 

    let titleLabel: UILabel = { 
     let label = UILabel() 
     // ... 
     return label 
    }() 

    let locationTextView: UITextView = { 
     let textView = UITextView() 
     // ... 
     return textView 
    }() 

    let userProfileImageView: CustomImageView = { 
     let imageView = CustomImageView() 
     // ... 
     return imageView 
    }() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     titleLabel.text = nameString 
     locationTextView.text = locationString 
     userProfileImageView.imageUrlString = profileImageUrl 
     setupViews() 
    } 
     func myMethod(str : String){ 
     nameString = str 
     print("var : \(String(describing: nameString))") 
     titleLabel.text = nameString 
    } 

    func getLocationMethod(str : String){ 
     locationString = str 
     print("var : \(String(describing: locationString))") 
     locationTextView.text = locationString 
    } 

    func getProfileImageMethod(str : String){ 
     profileImageUrl = str 
     print("var : \(String(describing: profileImageUrl))") 
//  userProfileImageView.image = UIImage(named: "meAndDuncan") 
     userProfileImageView.imageUrlString = profileImageUrl 
    } 
+0

Was das genaue Problem ist „ist nicht in der Lage das laden CustomImageView: UIImageView von demselben selectedIndexPath mit derselben Prozess- und Codelogik "? – shallowThought

+0

Ich habe die nameString- und locationString-Werte erfolgreich zwischen den Klassen übergeben und angezeigt, die in der Header-Zelle basierend auf der Zelle angezeigt werden, die im ersten main collectionViewController ausgewählt wurde. Aber das Übergeben der profileImageUrl-Zeichenfolge lädt nicht die ausgewählten Zellen profilImage (was ist die CustomImageView: UIImageView-Klasse (das Platzhalterbild wird immer angezeigt). – user3708224

+0

Was ist 'profileImageUrl'? – shallowThought

Antwort

0

hält dachte ich es alleine aus. Vielleicht selbsterklärend, aber ich hatte das imageUrlString zurück in Daten zu konvertieren (contentsOf: url) in meiner getProfileImageMethod (str: String) wie unten zu sehen:

func getProfileImageMethod(str : String){ 
    profileImageUrl = str 
    print("var : \(String(describing: profileImageUrl))") 
    // added the code below and it worked! 
    var imageUrlString: String? 
    imageUrlString = profileImageUrl 
    let url = URL(string: imageUrlString!) 
    let data = try? Data(contentsOf: url!) 
    let image: UIImage = UIImage(data: data!)! 

    userProfileImageView.image = image 
}