2016-06-15 35 views
1

我有以下代碼設置:選擇在NavigationItem調用函數「跳」,也就是在父導航欄

class MyNavigationBar: UINavigationBar { 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     let myNavItem = MyNavigationItem() 
     setItems([myNavItem], animated: false) 
    } 

    //Weird, the selector of the item calls this function 
    func doSomething() { 
     // This do some stuff 
    } 
} 

class MyNavigationItem: UINavigationItem { 

    private let myButton :UIBarButtonItem = { 
     let barButton = UIBarButtonItem(image: UIImage(named: "ic_topnav_userpic"), style: UIBarButtonItemStyle.Done, target: nil, action: #selector(doSomething)) 
     return barButton 
    }() 

    // Initializers 

    init() { 
     super.init(title: "Title") 
     rightBarButtonItem = myButton 
    } 
    //..other initializers   

    //This function is never called 
    func doSomething() { 
     // This should do some stuff 
    } 
} 

當我做我的StoryboardMyNavigationBar類型的任何UINavigationBar。然後,當我點擊myButton項目時,「選擇」的功能是MyNavigationBar的實施中存在的功能。

這是怎麼發生的?

它應該以這種方式行事嗎?,我期待着所謂的函數是MyNavigationItem裏面的函數。

回答

1

編輯:

let barButton = UIBarButtonItem(image: UIImage(named: "ic_topnav_userpic"), style: UIBarButtonItemStyle.Done, target: nil, action: #selector(doSomething)) 

目標應該是self#selector(self.doSomething)

+0

這是爲什麼呢? –

+0

你只是寫這個函數,但從來沒有真正地調用它。您可以使用對象調用某個函數,也可以將其寫入另一個您知道會執行的函數中。但是您在'class MyNavigationItem:UINavigationItem'中寫入的函數只是其他任何函數。它不會在任何地方被調用,不像你在'class MyNavigationBar:UINavigationBar'中寫的那個'override func awakeFromNib()'調用** FOR SURE **。 – Dershowitz123

+0

但爲什麼?我的選擇器指向MyNavigationItem中的一個。我甚至可以刪除MyNavigationBar中的一個,它不會抱怨。只需點擊按鈕 –

2

所以,這裏的東西:

當我說:有這個類(又名self)的實例

private let myButton :UIBarButtonItem = { 
     let barButton = UIBarButtonItem(image: UIImage(named: "ic_topnav_userpic"), style: UIBarButtonItemStyle.Done, target: nil, action: #selector(doSomething)) 
     return barButton 
    }() 

此方法執行之前,所以這是阻止我做#selector(self.doSomething)@ Dershowitz123建議。

一個快速的方法來避免這種情況使得這一let變量懶VAR代替:

private lazy var myButton :UIBarButtonItem = { 
     let barButton = UIBarButtonItem(image: UIImage(named: "ic_topnav_userpic"), style: UIBarButtonItemStyle.Done, target: self, action: #selector(self.showEditProfile)) 
     return barButton 
    }() 

仍然是怪異給我的唯一的事情是這樣的Selector s在這種情況下做。