2016-04-03 25 views
3

Uygulamanın durumuna bağlı olarak, sağ üst köşede UIBarButtonItem değiştiren UINavigationController var. , Görünüm yükü ben düğmeleri başlatmak ne zamanUIButton'um neden bir UIBarButtonItem içinde Nav Bar'da gösterilmiyor?

Ben

var editBarButton: UIBarButtonItem! 
var logoutBarButton: UIBarButtonItem! 
var showRepositoryBarButton: UIBarButtonItem! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    editButton = UIButton() 
    editButton.setImage(UIImage(named: "icon pencil"), forState: .Normal) 
    editButton.frame = CGRectMake(0, 0, 30, 30) 
    editButton.addTarget(self, action: #selector(UserProfileNavigatorController.onEditClick), forControlEvents: .TouchUpInside) 
    editBarButton = UIBarButtonItem(customView: editButton) 

    let logoutButton = UIButton() 
    logoutButton.setImage(UIImage(named: "icon logout"), forState: .Normal) 
    logoutButton.frame = CGRectMake(0, 0, 30, 30) 
    logoutButton.addTarget(self, action: #selector(UserProfileNavigatorController.onLogoutClick), forControlEvents: .TouchUpInside) 
    logoutBarButton = UIBarButtonItem(customView: logoutButton) 

    let showRepositoryButton = UIButton() 
    logoutButton.setImage(UIImage(named: "icon logout"), forState: .Normal) 
    logoutButton.frame = CGRectMake(0, 0, 30, 30) 
    logoutButton.addTarget(self, action: #selector(UserProfileNavigatorController.onShowRepositoryOnWebClick), forControlEvents: .TouchUpInside) 
    showRepositoryBarButton = UIBarButtonItem(customView: showRepositoryButton) 

    presenter.viewDidLoad() 
} 

ihtiyaç Ve duruma bağlı olarak, bu şekilde bu kodun gerçekten yürütülür rağmen

func showUserProfile() { 
    navigationItem.setRightBarButtonItems([editBarButton, logoutBarButton], animated: false) 
    Router.showUserProfileInNavigatorController(self) 
} 

func showRepository(repository: Repository) { 
    navigationItem.setRightBarButtonItems([showRepositoryBarButton], animated: false) 
    Router.showRepository(self, repository: repository) 
} 

görüntülenen düğmeler değiştirmek Sağ üst köşede hiçbir şey görünmez.

+0

Biraz daha kod gönderebilir misiniz? Yani viewDid/WillAppear ve showUserProfile vb. aradığınız yer –

cevap

1

sorun bu kod UINavigationController çalışan olmasıydı. Bunun yerine, UINavigationController'daki düğmeleri göstermesi gereken UIViewController.

Sadece kodu UIViewController içine taşımak için çalışıyor.

+0

İyi, showRepositoryButton göstermiyordu - bu, aşağıda belirttiğim bir hataydı. Uzun ve ayrıntılı cevabım için bile teşekkür bile edemediğim için çok şaşırdım ... –

+1

@DavidH Eğer kaba görünüyor olsaydım üzgünüm. Farklı bir hatayı doğru bir şekilde işaret etseniz de çözümünüz gerçekten çalışmıyordu. Bunun için zaten teşekkürler. –

0

Kodunuzda birden çok sorun olduğunu unutmayın. Öncelikle, UIButton() 'ın isteğe bağlı olmayan bir seçenek döndürürken, UIImage'ın isteğe bağlı olarak döndürebileceğini unutmayın. Bu yüzden, gerçekten resimlerinizin isimlerini doğru yazıp yazmadınız gerçekten bir fikriniz yok. Yukarıdaki kodunuzu kullanarak, içinde hiç resim olmayan basit bir proje oluşturdum ve resimlerin sıfır olması durumunda hiçbir şeyin gösterilmediğini yineledim.

Görüntü ekledikten sonra, yalnızca iki resim gösterdim. Kodunuza yakından baktığımızda, 3. resim loginButton'u yeniden tanımlar ancak showRepositoryButton'da herhangi bir özellik belirlemez.

Çeşitli öneriler:

  • bir UIButton kullanarak, belirlenen başlatıcı kullanırsanız bize "{...} do" bir alt bağlam oluşturmak için istenmeyen değişken tekrar kullanımını
  • önlemek için (UIButton (tip : ...) daha iyisi
  • , bir UIBarButtonItem (resim kullanmak: Opsiyonel malzemeler için ...)
  • ödeme gerçekten yakın ilgi ve uygun zamanda kazasında unwrapping zorla izin (veya bir assert, bekçi veya ön şartı kullanmak)

büyük ölçüde Kodu değiştirmeden, burada benim için iyi olanı ise:

override func viewDidLoad() { 
    super.viewDidLoad() 

    navigationItem.title = "Howdie!" 

    do { 
     let button = UIButton() 
     let image = UIImage(named: "02-redo")! 
     button.setImage(image, forState: .Normal) 
     button.frame = CGRectMake(0, 0, 30, 30) 
     button.addTarget(self, action: #selector(onEditClick), forControlEvents: .TouchUpInside) 
     editBarButton = UIBarButtonItem(customView: button) 
    } 

    do { 
     let button = UIButton() 
     let image = UIImage(named: "03-loopback")! 
     button.setImage(image, forState: .Normal) 
     button.frame = CGRectMake(0, 0, 30, 30) 
     button.addTarget(self, action: #selector(onLogoutClick), forControlEvents: .TouchUpInside) 
     logoutBarButton = UIBarButtonItem(customView: button) 
    } 

    do { 
     let button = UIButton() 
     let image = UIImage(named: "04-squiggle")! 
     button.setImage(image, forState: .Normal) 
     button.frame = CGRectMake(0, 0, 30, 30) 
     button.addTarget(self, action: #selector(onShowRepositoryOnWebClick), forControlEvents: .TouchUpInside) 
     showRepositoryBarButton = UIBarButtonItem(customView: button) 
    } 

    navigationItem.setRightBarButtonItems([editBarButton, logoutBarButton, showRepositoryBarButton], animated: false) 
}