【问题标题】:Swift properly aligns a UIBarButtonItem that was created programaticallySwift 正确对齐以编程方式创建的 UIBarButtonItem
【发布时间】:2015-06-28 18:24:28
【问题描述】:

我使用以下tutorial 在 Swift 中以编程方式创建 UIBarButtonItem,但图标未正确对齐边框。这是按钮的代码。谁能告诉我如何修改下面的代码以正确对齐 UIBarButtonItem 图像?

第一张图片显示了以编程方式创建的 uibarbuttonitem 的位置,第二张图片显示了从情节提要创建的 uibarbuttonitem。我希望以编程方式创建的 uibarbuttonitem 看起来像使用情节提要创建的 uibarbuttonitem。感谢您的帮助!

var button: UIButton = UIButton()
button.setImage(UIImage(named: "leftArrow.png"), forState: .Normal)
button.frame = CGRectMake(0, 0, 40, 40)
button.targetForAction("actioncall:", withSender: nil)

var leftBarButtonItem:UIBarButtonItem = UIBarButtonItem()
leftBarButtonItem.customView = button
self.navigationItem.leftBarButtonItem = leftBarButtonItem 

另外,如何正确设置按下 uibarbuttontiem 时的操作?我尝试了以下但从未调用过。

func actioncall(sender: AnyObject){
    println("action")
}

编辑 1:感谢 agy 的回复,我将代码更新如下。

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true)

   if (cond){

    var button: UIButton = UIButton()
    button.setImage(UIImage(named: "leftArrow.png"), forState: .Normal)
    button.frame = CGRectMake(0, 0, 40, 40)
    button.addTarget(self, action: "actioncall:", forControlEvents: .TouchUpInside)
    var leftBarButtonItem:UIBarButtonItem = UIBarButtonItem()
    leftBarButtonItem.customView = button

    var negativeSpacer:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
    negativeSpacer.width = -20; // set the value you need
    self.navigationItem.leftBarButtonItems  = [negativeSpacer,leftBarButtonItem]

   }
}

func actioncall(sender: UIButton!){
        println("action")
}

但操作仍然失败。当我按下 uibarbuttontiem 时应用程序崩溃并收到以下错误消息

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppName.ProfileViewController actioncall:]: unrecognized selector sent to instance 0x7a07a470'

动作的正确函数是什么?

编辑 2:actioncall 与我创建 UIBarButtonItem 的位置相同。我在 viewwillappear 上设置了 leftbarbutton,因为根据谁查看这个 viewcontroller,返回的选项将替换 leftbarbutton 上的前一个选项。

【问题讨论】:

  • 为什么,您不使用 IBOutlet 以编程方式配置栏按钮并在情节提要中创建它。使用 IBAction 实现该功能

标签: ios swift uibarbuttonitem


【解决方案1】:

尝试添加负间隔,并将方法 targetForAction 更改为 addTarget:

    var button: UIButton = UIButton()
    button.setImage(UIImage(named: "leftArrow.png"), forState: .Normal)
    button.frame = CGRectMake(0, 0, 40, 40)
    button.addTarget(self, action: "actioncall:", forControlEvents: .TouchUpInside)
    var leftBarButtonItem:UIBarButtonItem = UIBarButtonItem()
    leftBarButtonItem.customView = button

    var negativeSpacer:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
    negativeSpacer.width = -5; // set the value you need
    self.navigationItem.leftBarButtonItems = [negativeSpacer,leftBarButtonItem]

func actioncall(sender: UIButton!){
    print("Called")
}

【讨论】:

  • 太棒了,negativeSpacer 工作得很好。但是,动作调用仍然失败。与目标“actioncall:”对应的函数是什么?
  • 应该是func actioncall(sender: UIButton!)
  • 我试过“func actioncall(sender: UIButton!)”、“func actioncall(sender: UIButton?)”、“func actioncall(sender: UIButton)”、“func actioncall(sender: UIBarButtonItem? )”、“func actioncall(sender: UIBarButtonItem!)”和“func actioncall(sender: UIBarButtonItem)”,但它们都不起作用。我可能做错了什么?
  • 我已经尝试过代码,它运行良好。你在哪里定义actioncall?您在哪里创建 leftBarButtonItems?
  • 我在 viewWillAppear 函数中定义动作调用。这就是它对我失败的原因吗?我更新了上面的代码以显示这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多