[英]Swift 3.0 Adding a Right Button to Navigation Bar
我在視圖控制器的頂部添加了一個導航欄。 我試圖根據條件控制按鈕是否可見,但是我在添加按鈕時遇到問題。 到目前為止,我有,
var addButton: UIBarButtonItem = UIBarButtonItem(title: "test", style: .done, target: self, action: #selector(addTapped))
override func viewDidLoad() {
super.viewDidLoad()
let boool = true
if boool {
self.navigationItem.rightBarButtonItem = self.addButton
}
else {
self.navigationItem.rightBarButtonItem = nil
}
}
func addTapped(sender: AnyObject) {
print("hjxdbsdhjbv")
}
我認為它沒有正常工作,因為我已經在VC中添加了導航欄,而不是使用導航控制器並在那里使用欄。 我想知道是否有辦法使用此導航欄。
這很簡單。 將這行代碼放到viewDidLoad
:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "test", style: .done, target: self, action: #selector(addTapped))
更新為Swift 4或更高版本:
自定義功能:
@objc func action(sender: UIBarButtonItem) {
// Function body goes here
}
(自定義)右欄按鈕項:
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "some_text", style: .done, target: self, action: #selector(self.action(sender:)))
(自定義)左欄按鈕項:
self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(title: "some_text", style: .done, target: self, action: #selector(self.action(sender:)))
您還可以添加系統欄按鈕項,如下所示: UIBarButtonItem.SystemItem
為條形按鈕項定義系統提供的圖像: .add,.done,.cancel,.edit,.save,.compose,.reply,.organize和更多。
(系統)右欄按鈕項:
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonItem.SystemItem.add, target: self, action: #selector(self.action(sender:)))
(系統)左欄按鈕項:
self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonItem.SystemItem.add, target: self, action: #selector(self.action(sender:)))
let rightBarButtonItem = UIBarButtonItem.init(image: UIImage(named: "EditImage"), style: .done, target: self, action: #selector(ViewController.call_Method))
self.navigationItem.rightBarButtonItem = rightBarButtonItem
您說您通過故事板向視圖控制器添加了UINavigationBar
,但查看您提供的代碼,IB中的導航欄沒有插座連接。
為了訪問self.navigationItem
您的視圖控制器必須嵌入在UINavigationController
或者是層次結構的一部分。 除非您需要在單個視圖控制器上使用自定義導航欄,否則我建議從Interface Builder中刪除它,然后確保所討論的視圖控制器嵌入在UINavigationController
或者將其從另一個控制器推送到導航堆棧它嵌入在導航控制器中,然后你應該看到你的UIBarButtonItem
。
首先,您需要將導航欄連接到IBOutlet,以便您可以在代碼中引用它。 之后,此代碼應該工作:
let navigationItem = UINavigationItem(title: "Title")
navigationItem.rightBarButtonItem = self.addButton
navigationItem.hidesBackButton = true
self.navigationBar.pushItem(navigationItem, animated: false)
Swift 4.2;
添加viewController
override func viewDidLoad() {
super.viewDidLoad()
self.addNavigationBarButton(imageName: "ic_back", direction:.left)
}
添加Class
API或Utility Class
public func addNavigationBarButton(imageName:String,direction:direction){
var image = UIImage(named: imageName)
image = image?.withRenderingMode(.alwaysOriginal)
switch direction {
case .left:
self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
case .right:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
}
}
@objc public func goBack() {
self.navigationController?.popViewController(animated: true)
}
public enum direction {
case right
case left
}
在Xcode 10.2中測試,swift 5.0; 首先,我已經在IB中的UINavigationController中嵌入了我的ViewController。 然后在ViewDidLoad中包含這些行
self.title = "orange"
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(changeLayout)).
注意 - 訪問標題或通過導航控制器添加按鈕不起作用。 例如:設置標題 - Self.navigationcontroller.navigationItem.title不起作用,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.