IOS – Swift – добавление цели и действий в пользовательский интерфейс BarButtonItem

Я создаю пользовательский вид с uiimageview как подвью. Затем я использую этот пользовательский вид в своей навигационной панели как rightBarButtonItem. Это работает, чтобы отобразить правильный значок в нужном месте, но по какой-либо причине функция, которую я определяю в «действии», никогда не вызывается, поэтому segue не выполняется, когда я нажимаю на rightBarButtonItem. Как ни странно, если я НЕ вставляю пользовательское представление, но вместо этого комментирую этот бит и просто устанавливаю заголовок, цель и действие для 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)