IOS – Swift – 向BarButtonItem的customView添加目标和操作

我正在创建一个自定义视图,使用uiimageview作为子视图。 然后我在导航栏中将该自定义视图用作rightBarButtonItem。 这适用于在适当的位置显示正确的图标,但无论出于何种原因,我在“动作”中定义的函数永远不会被调用,因此当我点击rightBarButtonItem时不执行segue。 奇怪的是,如果我不插入自定义视图,而是注释掉该位,只需为rightItem设置标题,目标和操作,那么该函数将正确执行。 以某种方式添加自定义视图混淆目标和动作属性,但我似乎无法弄清楚如何解决它。 任何帮助将不胜感激!

//create custom view for right item and set it var imageViewRight:UIImageView = UIImageView() imageViewRight.frame = CGRectMake(5, 10, 35, 25) let rightImage:UIImage = UIImage(named: "cameraIconInactive")! imageViewRight.image = rightImage var rightView:UIView = UIView() rightView.frame = CGRectMake(0, 0, 45, 45) rightView.addSubview(imageViewRight) var rightItem:UIBarButtonItem = UIBarButtonItem() //this line right below is the problem - if I comment it out and replace with a simple rightItem.title = "test" and leave everything else the same, then the method runs properly rightItem.customView = rightView rightItem.target = self rightItem.action = "pushProfileToCamera" self.navigationItem.rightBarButtonItem = rightItem } func pushProfileToCamera(){ println("pushing profile to camera") self.performSegueWithIdentifier("pushProfileToCamera", sender: nil) } 

编辑:

实际上坐了24小时,并在看到这些答案建议之前提出了这个解决方案..任何理由我都不应该这样做? 有用..

 //create the custom rightBarButtonItem //create the imageView with icon var imageViewRight:UIImageView = UIImageView() imageViewRight.frame = CGRectMake(5, 10, 35, 25) var rightImage:UIImage = UIImage(named: "cameraIconInactive")! imageViewRight.image = rightImage //put the imageView inside a uiview var rightView:UIView = UIView() rightView.frame = CGRectMake(0, 0, 45, 45) rightView.addSubview(imageViewRight) //create the tap gesture recognizer for that uiview var rightGestureRecognizer:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "pushProfileToCamera") rightView.addGestureRecognizer(rightGestureRecognizer) //create the uibarbuttonitem, assign our custom view to it, and insert it in the nav bar! var rightItem:UIBarButtonItem = UIBarButtonItem() rightItem.customView = rightView self.navigationItem.rightBarButtonItem = rightItem 

您可以尝试而不是链接rightItemAction并将UIView添加到customView,将UIButton添加到rightBarButtonItem:

  var button: UIButton = UIButton() button.setImage(UIImage(named: "cameraIconInactive"), forState: .Normal) button.frame = CGRectMake(0, 0, 45, 45) button.targetForAction("pushProfileToCamera", withSender: nil) var rightItem:UIBarButtonItem = UIBarButtonItem() rightItem.customView = button self.navigationItem.rightBarButtonItem = rightItem 

试试这样吧

 var rightItem:UIBarButtonItem = UIBarButtonItem(image: rightImage, landscapeImagePhone: rightImage, style: UIBarButtonItemStyle.Plain, target: self, action: "pushProfileToCamera") 
 self.navigationController?.navigationBarHidden = false let navigationBar = UINavigationBar(frame: CGRectMake(0, 0, self.view.frame.size.width, 64)) // Offset by 20 pixels vertically to take the status bar into account navigationBar.backgroundColor = UIColor.blueColor() navigationBar.delegate = self; // Create a navigation item with a title let navigationItem = UINavigationItem() //menu button let menubutton: UIButton = UIButton(frame: CGRectMake(0, 0, 30, 30)) menubutton.setImage(UIImage(named: "menu"), forState: UIControlState.Normal) menubutton.addTarget(self, action: "btn_clicked", forControlEvents: UIControlEvents.TouchUpInside) //menu button custom view let leftView = UIView(frame: CGRectMake(0,0,30,30)) leftView.addSubview(menubutton) //left uibarbutton let leftItem:UIBarButtonItem = UIBarButtonItem(customView: leftView) navigationItem.leftBarButtonItem = leftItem //searchButton let searchbutton: UIButton = UIButton() searchbutton.setImage(UIImage(named: "search1x"), forState: UIControlState.Normal) searchbutton.frame = CGRectMake(0, 0, 30, 30) searchbutton.addTarget(self, action: "btn_clicked", forControlEvents: UIControlEvents.TouchUpInside) //menu button custom view let rightView = UIView(frame: CGRectMake(0,0,30,30)) rightView.addSubview(searchbutton) //right uibarbutton let rightItem:UIBarButtonItem = UIBarButtonItem(customView: rightView) navigationItem.rightBarButtonItem = rightItem // Assign the navigation item to the navigation bar navigationBar.items = [navigationItem] // Make the navigation bar a subview of the current view controller self.view.addSubview(navigationBar) 

UIBarButtonItem已经有了这个初始化器init(image: UIImage?, style: UIBarButtonItemStyle, target: AnyObject?, action: Selector)