【问题标题】:Change a Nav Bar button icon in Swift在 Swift 中更改导航栏按钮图标
【发布时间】:2015-03-28 04:27:23
【问题描述】:

当我点击它时,我正在尝试将按钮图标从 PLAY 更改为 PAUSE。但是我的代码不起作用。

这是我的@IBAction 代码。

@IBAction func playTimer(sender: AnyObject) {

    if buttonSwitch == 0 {
        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("result"), userInfo: nil, repeats: true)
        buttonSwitch = 1

        self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Pause, target: self, action: "setAlarm"), animated: true)

        println("2")

    } else {
        timer.invalidate()
        buttonSwitch = 0
    }

}

我已经尝试了所有方法,但没有任何反应。没有错误,图标也没有变化。

【问题讨论】:

标签: ios iphone swift xcode6


【解决方案1】:
//oh sorry! previously i had given Objective c code..., 

 var imageCheckUI:UIImage = UIImage(named: "checkmark-25.png")!
        var rectCheckFram : CGRect = CGRectMake(-10, 0, 20, 20)
        var BtnCheckUI : UIButton = UIButton(frame: rectCheckFram)
        BtnCheckUI .setBackgroundImage(imageCheckUI, forState: UIControlState.Normal)
        BtnCheckUI.addTarget(self, action: "Correctdata", forControlEvents:.TouchUpInside)


        imageCheckUI = UIImage(named: "appbar.close.png")!
        rectCheckFram  = CGRectMake(-10, 0, 30, 30)
        var BtnCloseUI : UIButton = UIButton(frame: rectCheckFram)
        BtnCloseUI .setBackgroundImage(imageCheckUI, forState: UIControlState.Normal)
        BtnCloseUI.addTarget(self, action: "close", forControlEvents:.TouchUpInside)
        let barbtncheck: UIBarButtonItem = UIBarButtonItem(customView: BtnCheckUI)
        var  barbtnRIght :UIBarButtonItem = UIBarButtonItem(customView: BtnCloseUI)
        let array:NSArray = NSArray(objects: barbtncheck,barbtnRIght)
        self.navigationItem.setRightBarButtonItems(array, animated: true)

【讨论】:

    【解决方案2】:

    当您说什么都没发生时,我假设您的 println 都没有显示。在这种情况下,请确保 buttonSwitch 最初设置为 0。如果这不能解决问题,请在 IBAction 函数的第一行放置一个中断,并查看当您按下按钮时它是否被调用。如果不是,则说明您的插座有问题。如果是这样,并且 println 正在工作,那么您的 navigationItem 参考就有问题。在您的代码中,您正在从播放切换到暂停,但是您需要将反向代码放在 else 语句中才能切换回来(如果这是您想要的)。

    【讨论】:

    • 好的。这是我的答案: buttonSwitch 最初设置为 0 - 是 println 正在显示 - 是 按钮工作正常 唯一不起作用的是更改图标代码。我认为这可能与 navigationItem 参考有关。我怎样才能做这个参考?代码正常吗?谢谢。
    【解决方案3】:
    // Use as it iss in you code for swift
    UIImage* image3 = [UIImage imageNamed:@"appbar.refresh.png"];
            CGRect frameimg = CGRectMake(-10, 0, 30, 30);
            UIButton *someButton = [[UIButton alloc] initWithFrame:frameimg];
            [someButton setBackgroundImage:image3 forState:UIControlStateNormal];
            [someButton addTarget:self action:@selector(RefresInformation:)forControlEvents:UIControlEventTouchUpInside];
            [someButton setShowsTouchWhenHighlighted:YES];
            UIImage* image4 = [UIImage imageNamed:@"appbar.save.png"];
            CGRect frameimg4 = CGRectMake(0, 0, 30, 30);
            UIButton *someButton4 = [[UIButton alloc] initWithFrame:frameimg4];
            [someButton4 setBackgroundImage:image4 forState:UIControlStateNormal];
            [someButton4 addTarget:self action:@selector(SaveNewProjectRecord:)forControlEvents:UIControlEventTouchUpInside];
            [someButton setShowsTouchWhenHighlighted:YES];
            UIImage* image5 = [UIImage imageNamed:@"appbar.close.png"];
            UIButton *someButton5 = [[UIButton alloc] initWithFrame:frameimg4];
            [someButton5 setBackgroundImage:image5 forState:UIControlStateNormal];
            [someButton5 addTarget:self action:@selector(CancelTransaction:)forControlEvents:UIControlEventTouchUpInside];
            [someButton5 setShowsTouchWhenHighlighted:YES];
            UIBarButtonItem *mailbutton =[[UIBarButtonItem alloc] initWithCustomView:someButton];
            UIBarButtonItem *mailbutton4=[[UIBarButtonItem alloc] initWithCustomView:someButton4];
            UIBarButtonItem *mailbutton5=[[UIBarButtonItem alloc] initWithCustomView:someButton5];
            self.navigationItem.rightBarButtonItems=[[NSArray alloc] initWithObjects:mailbutton5,mailbutton, mailbutton4, nil];
    

    【讨论】:

    • 此代码不起作用。我试图放入我的 Swift 项目中,但有很多错误。我什至可以看到一些来自 Objective-c 而不是 Swift 的句子。但是谢谢你的尝试。
    【解决方案4】:

    这是工作代码,我猜你忘记了动作上的“:”......也许......

    import UIKit
    
    
    class ViewController: UIViewController {
    
        var buttonSwitch : Int!
        var timer : NSTimer!
        override func viewDidLoad() {
            super.viewDidLoad()
            buttonSwitch = 0;
            self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "playTimer:"), animated: true)
    
    
        }
    
        @IBAction func playTimer(sender: AnyObject) {
            if buttonSwitch == 0 {
                timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("result"), userInfo: nil, repeats: true)
                buttonSwitch = 1
                self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Pause, target: self, action: "playTimer:"), animated: true)
    
                println("2")
    
            } else {
                self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "playTimer:"), animated: true)
                timer.invalidate()
                buttonSwitch = 0
            }
        }
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    
    }
    

    【讨论】:

    • 对不起。我复制并粘贴了相同的代码,它可以工作,但图标没有改变:(。有什么选项可以显示给你吗?Skype 共享屏幕?环聊?谢谢。
    • 你的意思是它可以工作但它不会改变图标?什么有效?
    • 我正在寻找的是当您点击播放按钮时,它应该会暂停。如果您再次单击它应该会更改为播放按钮。时钟在工作,但播放按钮没有改变。
    • 您是否在新的视图控制器中尝试过该代码,该代码必须引用您自己的代码,因为我不知道整个视图控制器代码的样子
    【解决方案5】:

    这是简单的代码。运行 Xcode 6.3 此代码不会更改按钮标识符。设置是一个单一的视图控制器。 Navigation Bar Item,导航栏左侧的一个Button Bar Item。将按钮栏项目链接到 IBAction“playTimer”。

    import UIKit
    
    class ViewController: UIViewController {
    
        var buttonSwitch : Int!
        var timer : NSTimer!
        override func viewDidLoad() {
            super.viewDidLoad()
            buttonSwitch = 0;
            self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "playTimer:"), animated: true)
        }
    
        @IBAction func playTimer(sender: AnyObject) {
    
            if buttonSwitch == 0 {
                println("buttonSwitch = 0")
                buttonSwitch = 1
                self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Pause, target: self, action: "playTimer:"), animated: true)
    
            }  else {
                println("buttonSwitch = 1")
                self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "playTimer:"), animated: true)
                buttonSwitch = 0
            }
        }
    
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    
    }
    

    此论坛上的一些帖子声称使用此代码或类似代码解决了按钮项目标识符更改问题,但我和其他尝试此代码的人发现它可以运行,但按钮标识符没有更改。两个 println() 语句交替显示并按预期显示,但按钮不会更改。不在 viewDidLoad 中,也不在 playTimer 中。

    请:在版主将此“答案”作为非答案删除之前,请考虑它是上述答案的清理示例答案,据称应该可以工作。这个问题至少出现在这个论坛的五个帖子中,但没有一个包含执行的答案。请考虑允许这个“答案”站起来,希望聪明的人可以接受这个代码并修改它,以便按钮标识符发生变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2017-07-24
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多