2つのイメージを切り替えることで、バーボタンアイテムを「トグル」する機能があります。スウィフト - 動的に追加されたアクションは起動しません。
class Buttons {
func ToggleBarButton(button : UIBarButtonItem, name : String, location : BarButtonLocation, isEnabled : Bool, viewController : UIViewController) {
var iconName = name
if (!isEnabled) {
iconName += "EnabledIcon"
} else {
iconName += "DisabledIcon"
}
let newIcon = UIImage(named: iconName)
let newButton = UIBarButtonItem(image: newIcon, style: .Plain, target: self, action: button.action);
switch location {
case BarButtonLocation.Left:
viewController.navigationItem.leftBarButtonItem = newButton;
viewController.navigationItem.leftBarButtonItem?.tintColor = UIColor.blackColor();
case BarButtonLocation.SecondLeft:
viewController.navigationItem.leftBarButtonItems?[1] = newButton
viewController.navigationItem.leftBarButtonItems?[1].tintColor = UIColor.blackColor()
default:
return;
}
}
}
また、バーボタン項目の動作があるビューコントローラクラスもあります。
class GradesViewController: UIViewController {
var isFilterEnabled = false
var isViewEnabled = false
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
@IBAction func filterButton_Pressed(sender: UIBarButtonItem) {
Buttons().ToggleBarButton(sender, name : "Filter", location: BarButtonLocation.Left, isEnabled: isFilterEnabled, viewController: self);
isFilterEnabled = !isFilterEnabled;
}
@IBAction func viewButton_Pressed(sender: UIBarButtonItem) {
Buttons().ToggleBarButton(sender, name : "View", location: BarButtonLocation.SecondLeft, isEnabled: isViewEnabled, viewController: self);
isViewEnabled = !isViewEnabled;
}
}
最初のプレスでは、イメージは有効な形式に変更されますが、2回目のプレスでは何も起こりません(プレスイベントは起動しません)。私は確認し、button.action
は"filterButton_Pressed:"
と正しく識別されています。何が問題なのですか?これを行う簡単な方法はありますか?事前にお返事ありがとうございます。
'Buttons()。ToggleBarButton(...)'は、真新しい 'Buttons'インスタンスで' ToggleBarButton'を呼び出します。これは正しいとは思わない。 – dasblinkenlight
@dasblinkenlight私は、問題をビューコントローラからボタンクラスにコピーし、 'target:self'を' target:viewController'に変更しなかったことに気付きました。今それは正常に動作します。しかし、今、私はその新しいボタンインスタンスに興味があります...どのように正しく書き込まれる必要がありますか? –
'Button'の' ToggleBarButton'関数はインスタンス変数を使用しないので、新しいインスタンスを作るのではなく、 'static'(または' class'、それは同じこと)にして、クラス名を参照して呼び出す必要があります。 – dasblinkenlight