UIBarButtonItem
을 호출 하여 설정 한 내부에 사용자 정의보기가 있습니다 -initWithCustomView
. 내 바 버튼 항목은 잘 렌더링되지만 탭하면 대상 개체에 대한 작업이 호출되지 않습니다.
내 코드는 다음과 같습니다.
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"someImage.png"]];
UIBarButtonItem *bbItem = [[UIBarButtonItem alloc] initWithCustomView:imageView];
self.navigationItem.leftBarButtonItem = bbItem;
[imageView release];
[bbItem setTarget:self];
[bbItem setAction:@selector(deselectAll)];
답변
UIBarButtonItem의 대상과 동작이 사용자 지정보기에 적용되지 않는다고 생각합니다. UIImageView 대신 UIButton을 사용하고 버튼에 대상과 작업을 적용 해보십시오.
Swift의 샘플 코드 :
let button = UIButton(type: .Custom)
if let image = UIImage(named:"icon-menu.png") {
button.setImage(image, forState: .Normal)
}
button.frame = CGRectMake(0.0, 0.0, 30.0, 30.0)
button.addTarget(self, action: #selector(MyClass.myMethod), forControlEvents: .TouchUpInside)
let barButton = UIBarButtonItem(customView: button)
navigationItem.leftBarButtonItem = barButton
답변
나는 같은 문제가 있었지만 UIButton
내 UIBarButtonItem
(drawonward의 응답에 따라) 사용자 정의보기 대신 사용하는 것을 싫어했습니다 .
또는 UIGestureRecognizer
초기화에 사용하기 전에 사용자 정의보기에를 추가 할 수 있습니다 UIBarButtonItem
. 이것은 내 프로젝트에서 작동하는 것 같습니다.
이것이 원래 코드를 수정하는 방법입니다.
UIImageView *SOCImageView = [[UIImageView alloc] initWithImage:
[UIImage imageNamed:@"cancel_wide.png"]];
UITapGestureRecognizer *tapGesture =
[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(deselectAll:)];
[SOCImageView addGestureRecognizer:tapGesture];
SOItem.leftBarButtonItem =
[[[UIBarButtonItem alloc] initWithCustomView:SOCImageView] autorelease];
[tapGesture release];
[SOCImageView release];
답변
작동 방법은 다음과 같습니다.
UIButton* infoButton = [UIButton buttonWithType: UIButtonTypeInfoLight];
[infoButton addTarget:self action:@selector(displayAboutUs) forControlEvents:UIControlEventTouchDown];
UIBarButtonItem* itemAboutUs =[[UIBarButtonItem alloc]initWithCustomView:infoButton];
…
답변
다음은 UIBarButtonItem 내부에 UIButton을 구현 한 방법입니다.
UIButton *logoButton = [UIButton buttonWithType:UIButtonTypeCustom];
[logoButton setImage: [UIImage imageNamed:@"icon.png"] forState:UIControlStateNormal];
logoButton.frame = CGRectMake(0, 0, 30, 30);
[logoButton addTarget:self action:@selector(showAbout:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:logoButton];
self.navigationItem.rightBarButtonItem = barItem;
[barItem release];
답변
비슷한 문제가있었습니다. 그리고 처음에는 @drawnonward가 제안한 경로를 따랐지만 iPad에 팝 오버 컨트롤러를 표시하려고 할 때 문제가 발생했습니다. 내장 된 UIButton을 사용자 정의보기로 사용하면 UIButton이 이벤트의 발신자임을 의미합니다. 팝 오버 컨트롤러의 presentPopoverFromBarButtonItem : 메서드는 실제 UIBarButtonItems에만 적합한 메시지를 보내려고 할 때 충돌합니다.
결국 내가 찾은 해결책은 일회용 UIButton에서 사용하려는 이미지 ( “정보”아이콘)를 훔치고 다음과 같이 내 UIBarButtonItem을 구성하는 것입니다.
// Make the info button use the standard icon and hook it up to work
UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
UIBarButtonItem *barButton = [[[UIBarButtonItem alloc]
initWithImage:infoButton.currentImage
style:UIBarButtonItemStyleBordered
target:self
action:@selector(showInfo:)] autorelease];
이 이니셜 라이저를 사용하면 타겟과 선택기가 실제로 작동하는 바 버튼이 생성됩니다. 사용자 정의보기에서 이미지를 래핑하는 것보다 더 쉽지만 그것은 단지 장식 일뿐입니다.
답변
UIImage로 정착하지 않고 barbuttonitem에 사용자 정의보기가있는 경우, 탭 제스처 인식기를 barbuttonitem의 customview 속성으로 설정하십시오.
let tap = UITapGestureRecognizer(target: self, action: #selector(goProButtonPressed))
deviceStatusBarButtonItem.customView?.addGestureRecognizer(tap)
답변
Jacob, 모든 것이 좋아 보이지만 올바른 선택기를 제공하지 않았을 수 있습니다.
귀하의 작업이 실제로 선언되었는지 확인할 수 있습니까?
- (void) deselectAll;
그리고 아닙니다
- (void) deselectAll:(id)sender;
후자의 경우 작업을로 설정해야합니다 @selector(deselectAll:)
. (메서드 선언과 일치하는 세미콜론에 유의하십시오)
또한 void는 일 수 IBAction
있지만이 문제와 관련이 없습니다.