2017-07-31 116 views
1

我最近開始學習Swift。當我試圖讓我的第一個App我與UIBarButtonItem混淆。如果我在viewDidLoad()函數之外放置UIBarButtonItem初始值,當按下一個按鈕時不會發生任何反應。Swift,與UIBarButtonItem混淆

class ViewController: UIViewController, UITextFieldDelegate { 
    let rightBarButton: UIBarButtonItem = UIBarButtonItem(title: "Next", style: .plain, target: self, action: #selector(onClickNext(button:))) 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.backgroundColor = .white 

     self.navigationItem.rightBarButtonItem = rightBarButton 
    } 

    func onClickNext(button: UIBarButtonItem) { 
     print("should push view controller") 
    } 
} 

然而,當我把initializationviewDidLoad()功能,輸出方面的確輸出,我在onClickNext(button:)功能設置的sentense。

class ViewController: UIViewController, UITextFieldDelegate { 
    var rightBarButton: UIBarButtonItem? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.backgroundColor = .white 

     self.rightBarButton = UIBarButtonItem(title: "Next", style: .plain, target: self, action: #selector(onClickNext(button:))) 
     self.navigationItem.rightBarButtonItem = rightBarButton 
    } 

    func onClickNext(button: UIBarButtonItem) { 
     print("should push view controller") 
    } 
} 

而且,我我發現,當我把initializationviewDidLoad()功能外,還加了一個UITextFieldviewControllerrightBarButton作品,如果我碰textfield之前,我按下按鈕。

這讓我感到困惑。什麼是機制?

+0

非常好的問題 –

+0

這應該是一個錯誤,你可以參考一下這個問題:https://stackoverflow.com/questions/43842928/ios-lazy-var-uibarbuttonitem-target-issue – user5685969

回答

0

好吧,也許你缺少一個視圖控制器的工作機制。

首先,viewDidLoad是您通常在區域設置或初始化視圖的任何視圖或屬性。在視圖控制器對象的生命週期中,該方法也僅被調用一次。這意味着self已經存在。

知道了這一點,重要的是要了解let屬性確實,(蘋果)

恆定聲明定義的不可改變常量名和初始化表達式的值之間的結合什麼;在設定常數值後,不能更改。也就是說,如果一個常量是用一個類對象初始化的,那麼該對象本身可以改變,但是常量名和它引用的對象之間的綁定不能。

即使上部區域是你聲明的變量和常量,通常意味着簡單的初始化,這是一個面積只是告訴VC的存在,你要使用的對象,將有一類全局範圍,但是當視圖層次結構被加載時(意味着對象不依賴於自己,例如,將目標添加到按鈕時,指的是自己內部的方法),將添加其餘的功能。 ..這個變量或常量被稱爲Stored Properties

以最簡單的形式,存儲的屬性是一個常量或變量,存儲爲一個實例的一部分特定類別或結構。存儲屬性可以是變量存儲屬性(由var關鍵字引入)或常量存儲屬性(由let關鍵字引入)。

最後,你有懶存儲的屬性,也許可以應用於你想要的東西:

懶惰的存儲屬性是一個屬性,它的初始值不計算直到第一次它被使用。通過在聲明之前編寫lazy修飾符來指示惰性存儲屬性。

解決方案:創建一個懶惰的VAR存儲的屬性或添加自己的屬性裏面viewDidLoad中(自檢時已經存在)

lazy private var doneButtonItem : UIBarButtonItem = { 
    [unowned self] in 
    return UIBarButtonItem(title: "Next", style:UIBarButtonItemStyle.Plain, target: self, action: #selector(onClickNext(button:))) 
    }() 

OR

let rightBarButton: UIBarButtonItem? 

override func viewDidLoad() { 
     super.viewDidLoad() 
     rightBarButton = UIBarButtonItem(title: "Next", style: .plain, target: self, action: #selector(onClickNext(button:))) 
} 
+1

謝謝!這解決了我的第一個問題。現在我對第二個問題感到好奇:如果在按下按鈕之前觸摸文本字段,爲什麼它會起作用? – Leadrains

+0

@ user5685969說它可能是一個錯誤引用的問題:https://stackoverflow.com/questions/43842928/ios-lazy-var-uibarbuttonitem-target-issue – Leadrains

+0

你是否添加UITtexField而不設置它的委託?你如何通過代碼或xib添加這個控件?這可能是一個錯誤,但我需要更多信息 –

0
import UIKit 


    class ViewController: UIViewController { 

     var btnName = UIButton() 



     override func viewDidLoad() { 
      super.viewDidLoad() 
      btnName.setImage(UIImage(named: "imagename"), for: .normal) 
      btnName.frame = CGRect(x:0,y: 0,width: 30,height: 30) 
      btnName.addTarget(self, action: #selector(addTargetActionForButton(:_)), for: .touchUpInside) 

      let rightBarButton = UIBarButtonItem(customView: btnName) 
      self.navigationItem.rightBarButtonItem = rightBarButton 

     } 

     func addTargetActionForButton(_ sender : UIButton){ 


     } 
    } 
+0

感謝。但我知道如何使它工作,我只是混淆了爲什麼當我將初始化放在viewDidLoad()函數之外時它不起作用。 – Leadrains

0

你正在採取讓變量出側viewDidLoad你不能讓讓全局變量。如果你想讓你比你需要在viewDidLoad中聲明。富勒更多信息,讓和VAR檢查此鏈接What is the difference between `let` and `var` in swift?

override func viewDidLoad() { 

    let rightBarButton: UIBarButtonItem = UIBarButtonItem(title: "Next", style: .plain, target: self, action: #selector(onClickNext(button:))) 

    super.viewDidLoad() 
    self.view.backgroundColor = .white 

    self.navigationItem.rightBarButtonItem = rightBarButton 


} 
+0

我使它變量變量,仍然把viewDidLoad()函數以外的初始化,但它仍然無法工作.. – Leadrains

+0

但我檢查了讓和var它工作正常我的結局 –

+0

沒有問題是,如果點擊textfield按鈕完美工作,否則不是 –

0

UIBatButtonItem可能包含的UIButton

enter image description here 上面的例子中的圖像具有UINavigationItem含有LeftBarButtonItems([UIBarButton]),和RightBarButtonItems([的UIBarButtonItem]),每個的UIBarButtonItem包含的UIButton

我們可以自定義的UIButton指定如何在查看 顯示和我們可以連接按鈕操作直接到UIButton的