programing

UIBarButtonItem: target-action이 작동하지 않습니까?

sourcejob 2023. 8. 27. 09:06
반응형

UIBarButtonItem: target-action이 작동하지 않습니까?

내부에 사용자 정의 보기가 있습니다.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 대신 UII 버튼을 사용하여 대상 및 작업을 버튼에 적용해 보십시오.

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(응답에 따라 표시됨).

또는 다음을 추가할 수 있습니다.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];

저도 비슷한 문제가 있었습니다.그리고 처음에는 @drawonward가 제안한 경로를 따랐지만, iPad에서 Popover 컨트롤러를 표시하려고 할 때 문제가 발생했습니다.내장된 UIButton을 사용자 정의 보기로 사용하면 UIButton이 이벤트의 보낸 사람이 되고, PopoverController의 현재 PopoverFromBarButtonItem: 메서드가 실제 UIBarButtonItem에만 적합한 메시지를 보내려고 하면 메서드가 충돌합니다.

결국 제가 찾은 해결책은 일회용 UIButton에서 사용하고 싶은 이미지("info" 아이콘)를 훔치고 다음과 같이 UIButtonItem을 구성하는 것이었습니다.

// 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];

이 이니셜라이저를 사용하면 대상과 선택기가 실제로 작동하는 막대 단추가 생성됩니다.또한 사용자 정의 보기에서 이미지를 감싸는 것보다 쉽지만, 그것은 단지 아이싱일 뿐입니다.

UI 이미지를 사용하지 않고 막대 단추 항목에 사용자 지정 보기를 사용하려면 막대 단추 항목의 사용자 지정 보기 속성에 탭 제스처 인식기를 설정합니다.

let tap = UITapGestureRecognizer(target: self, action: #selector(goProButtonPressed)) deviceStatusBarButtonItem.customView?.addGestureRecognizer(tap)

스위프트 3.바 버튼 아이템 내부에 커스텀 뷰가 있는 비슷한 문제가 있었습니다.탭을 작동시키기 위해 보기에 제스처를 할당하고 동작을 설정했습니다.뷰는 뷰에 할당할 수 있는 배출구가 필요했습니다.이렇게 하면 사용자 정의 보기에서 작동합니다.

제스처를 클래스 변수로 설정

@IBOutlet weak var incidentView: UIView!
let incidentTap = UITapGestureRecognizer()

뷰에서 DidLoad

incidentTap.addTarget(self, action: #selector(self.changeIncidentBarItem))
incidentView.addGestureRecognizer(incidentTap)

제이콥, 모든 게 좋아 보이지만, 당신이 올바른 선택기를 제공하지 않았을 수도 있습니다.

작업이 실제로 선언되었는지 확인할 수 있습니까?

- (void) deselectAll;

그리고 아닌

- (void) deselectAll:(id)sender;

을 후의경작다음설로합정야니해다로 설정해야 합니다.@selector(deselectAll:) 선언과 참고

는 한는, void는 또도일 수 .IBAction하지만 그건 당신이 겪고 있는 이 문제와 관련이 없습니다.

Swift 3: 아래는 버튼 사용자 지정 및 이벤트 처리를 위한 전체 구현입니다.

override func viewDidLoad() {
    super.viewDidLoad()

    let button = UIButton.init(type: .custom)
    button.setTitle("Tester", for: .normal)
    button.setTitleColor(.darkGray, for: .normal)
    button.layer.borderWidth = 1
    button.layer.cornerRadius = 5
    button.layer.borderColor = UIColor.darkGray.cgColor
    button.addTarget(self, action: #selector(self.handleButton), for: .touchUpInside)

    self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)
}

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

    if let button = self.navigationItem.rightBarButtonItem?.customView {
        button.frame = CGRect(x:0, y:0, width:80, height:34)
    }
}

func handleButton( sender : UIButton ) {
    // It would be nice is isEnabled worked...
    sender.alpha = sender.alpha == 1.0 ? 0.5 : 1.0
}

이것이 도움이 되길 바랍니다.

사용자 정의 보기가 터치 이벤트를 먹습니까? 아니면 상위 보기로 전달합니까?

이 작업을 쉽게 하기 위해 UIBarButtonItem에 다음과 같은 범주를 만들었습니다.

@implementation UIBarButtonItem (CustomButtonView)

- (void)setButtonImage:(UIImage *)image
{
    UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setBackgroundImage:image forState:UIControlStateNormal];
    [button sizeToFit];
    [button addTarget:self.target action:self.action forControlEvents:UIControlEventTouchUpInside];
    self.customView = button;
}

- (UIImage *)buttonImage
{
    return [(UIButton *)self.customView imageForState:UIControlStateNormal];
}

@end

클라이언트 코드에서 다음을 사용합니다.

myBarButtonItem.buttonImage = [UIImage imagedNamed:@"image_name"];

이렇게 하면 IB에서 목표와 작업을 연결할 수 있습니다(가능한 많은 UI 구성을 IB에 푸시하는 것은 좋은 일입니다).

언급URL : https://stackoverflow.com/questions/2796438/uibarbuttonitem-target-action-not-working

반응형