2017-03-10 3 views
0

Bisher habe ich versucht, die linke Leiste Button Element zu erzielen, die Sie im folgenden Bild sehen:Place Foto von URL als Navigationsleiste Button-Artikel

enter image description here

ich nicht im Stil codiert haben doch einfach der Grundcode für das Profilbild. Hier ist sie:

let user = FIRAuth.auth()?.currentUser 
var profilePicture: UIImageView? 

override func viewDidLoad() { 
    //left bar button item setup 

    if let profileURL = self.user?.photoURL?.absoluteString { 
     let profilePictureUrl = NSURL(string: profileURL) 
     profilePicture?.af_setImage(withURL: profilePictureUrl as! URL) 

     let barButton = UIBarButtonItem(image: profilePicture?.image, landscapeImagePhone: nil, style: .done, target: self, action: #selector(revealBackClicked)) 
     self.navigationItem.leftBarButtonItem = barButton 
    } 


} 

ich mein Foto von Feuerbasis bin Abrufen der folgenden Funktion:

self.user?.photoURL?.absoluteString 

ich eine URL erhalte, wie ich es getestet, indem sie in meiner Ausgabe zu drucken. Ich denke jedoch, das Problem ist, wenn ich das Bild in der Variable profilePicture einstelle, denn wenn ich das ausdrucke, erhalte ich null.

Jede Hilfe wäre sehr willkommen!

+0

'photoURL' ist bereits ein' URL'. Warum sollte man seinen 'absolutenString' erzeugen, einen' NSURL' erzeugen (nicht in Swift3 verwenden), und dann auf 'URL' umwandeln? Das sind 3 verschwendete Schritte. – rmaddy

+0

Weil es einen erwarteten Rückgabetyp einer Zeichenfolge hat. –

+0

Was hat einen erwarteten Rückgabetyp einer Zeichenfolge? Tun Sie einfach: 'Wenn ProfilURL = self.user? .photoURL? {profilePicture? .af_setImage (withURL: profileURL) ... 'Keine Notwendigkeit für alle überflüssigen Konvertierungen und Umwandlungen. – rmaddy

Antwort

1

Das Problem, das Sie versuchen, ein Bild zu UIBarButtonItem beim noch das Bild herunterladen. Sie sollten das Image herunterladen und dann das Image auf UIBarButtonItem festlegen.

let profilePictureUrl = NSURL(string: profileURL) 

let downloader = ImageDownloader() 
let urlRequest = URLRequest(url: profilePictureUrl) 

downloader.download(urlRequest) { response in 
    if let image = response.result.value { 
     let barButton = UIBarButtonItem(image: image, landscapeImagePhone: nil, style: .done, target: self, action: #selector(revealBackClicked)) 
     self.navigationItem.leftBarButtonItem = barButton 
    } 
} 
+1

Hey, deine Entscheidung hat nicht funktioniert. Das Bild wird immer noch nicht geladen –

+0

@RohanVasishth, vielleicht weil Sie nicht einen starken Bezug auf den Downloader halten? Siehe alamofire docs: 'Achten Sie darauf, einen starken Verweis auf die ImageDownloader-Instanz beizubehalten, andernfalls wird die Beendigung nicht aufgerufen, da die Downloader-Referenz den Gültigkeitsbereich verlässt, bevor der Abschlussabschluss aufgerufen werden kann.' –

0
let user = FIRAuth.auth()?.currentUser 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let profilePictureURL = self.user?.photoURL 

    DispatchQueue.global().async { 
     let data = try? Data(contentsOf: profilePictureURL!) 
     DispatchQueue.main.async { 
      let button = UIButton.init(type: .custom) 
      button.setImage(UIImage(data: data!), for: UIControlState.normal) 
      button.layer.cornerRadius = 0.5 * button.bounds.size.width 
      button.clipsToBounds = true 
      button.addTarget(self, action: #selector(UserGroupsMainViewController.profileButtonPressed), for: UIControlEvents.touchUpInside) 
      button.frame = CGRect(x: 0, y: 0, width: 50, height: 50) 

      let barButton = UIBarButtonItem(customView: button) 
      self.navigationItem.leftBarButtonItem = barButton 

     } 
    } 

} 

func profileButtonPressed() { 

    print("Show Profile") 
}