View Controllerの上部に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にナビゲーションバーを追加したため、正しく機能していないと思います。このナビゲーションバーを操作する方法があるかどうか疑問に思っていました。
ストーリーボードを介してView ControllerにUINavigationBar
を追加したと言いますが、提供したコードを見ると、IBのナビゲーションバーへのアウトレット接続はありません。
self.navigationItem
にアクセスするには、View ControllerをUINavigationController
に埋め込むか、階層の一部にする必要があります。個々のView ControllerにカスタムNavigation Barが必要でない限り、Interface Builderから削除し、問題のView ControllerがUINavigationController
に埋め込まれているか、Navigationにプッシュされていることを確認することをお勧めしますNavigation Controllerに組み込まれている別のコントローラーからスタックすると、UIBarButtonItem
が表示されます。
それは簡単です。次のコード行を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
まず、ナビゲーションバーを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またはユーティリティクラスに追加します
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)).
注-タイトルへのアクセス、またはNavigation Controllerを介したボタンの追加は機能しませんでした。たとえば、タイトルの設定-Self.navigationcontroller.navigationItem.titleは機能しませんでした。