2016-06-12 6 views
0

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:"と正しく識別されています。何が問題なのですか?これを行う簡単な方法はありますか?事前にお返事ありがとうございます。

+0

'Buttons()。ToggleBarButton(...)'は、真新しい 'Buttons'インスタンスで' ToggleBarButton'を呼び出します。これは正しいとは思わない。 – dasblinkenlight

+0

@dasblinkenlight私は、問題をビューコントローラからボタンクラスにコピーし、 'target:self'を' target:viewController'に変更しなかったことに気付きました。今それは正常に動作します。しかし、今、私はその新しいボタンインスタンスに興味があります...どのように正しく書き込まれる必要がありますか? –

+0

'Button'の' ToggleBarButton'関数はインスタンス変数を使用しないので、新しいインスタンスを作るのではなく、 'static'(または' class'、それは同じこと)にして、クラス名を参照して呼び出す必要があります。 – dasblinkenlight

答えて

0

私は、問題をビューコントローラからボタンクラスにコピーし、target: selftarget: viewControllerに変更しなかったことに気付きました。しかし、とにかくすべての答えをありがとう...

1

各ケースの後にbreakステートメントを入れて試してください。 また、セミコロンも削除します。

+0

もちろん、ありがとう、しかしこれは問題ではなかった。 (私はなぜそれが働いたのだろうか。それは他のボタンもトグルしていたはずだ...) –

+0

@Geiszlaブレークはswitch文ではオプションです。セミコロンもオプションです。 – Code

関連する問題