programing

UIMuController가 표시되지 않음

elecom 2023. 9. 20. 20:04
반응형

UIMuController가 표시되지 않음

사용자 지정 UIMuController를 만들어 내 보기에 표시하려고 합니다.제 암호는 이렇습니다.

UIMenuController *menuController = [UIMenuController sharedMenuController];
    UIMenuItem *listMenuItem = [[UIMenuItem alloc] initWithTitle:@"List" action:@selector(addList:)];

    [menuController setMenuItems:[NSArray arrayWithObject:listMenuItem]];
    [menuController setTargetRect:CGRectMake(50.0, 50.0, 0, 0) inView:self.view];
    [menuController setMenuVisible:YES animated:YES];

    [listMenuItem release];

오류나 예외는 없지만 메뉴 컨트롤러가 나타나지 않을 뿐입니다.

다음 세 가지를 수행해야 합니다.

  1. 뷰 또는 뷰 컨트롤러를 호출해야 합니다.
  2. 뷰 또는 뷰 컨트롤러를 구현해야 합니다(복귀).YES).
  3. 선택적으로 보기 또는 보기 컨트롤러는 개별적으로 메뉴 항목을 표시/숨기기 위해 구현할 수 있습니다.

답에는 세 가지가 언급되어 있지만, 까다롭게 말하면, 여섯 가지가 있습니다.

  1. 메뉴 처리기는 UIView여야 합니다.그렇지 않다면,-becomeFirstResponder실패.
  2. 메뉴 핸들러는 다음을 수행해야 합니다.userInteractionEnabled = YES
  3. 메뉴 처리기는 보기 계층 및 보기 계층에 있어야 합니다.-window속성은 뷰에 대한 창과 동일해야 합니다.inView:논쟁.
  4. 구현해야 합니다.-canBecomeFirstResponder그리고 돌아오세요YES.
  5. 전화를 해야합니다.[handler becomeFirstResponder], 전에 [menu setTargetRect:inView:]가 호출됩니다. 그렇지 않으면 후자가 실패합니다.
  6. 전화를 해야합니다.[menu setTargetRect:inView](최소 1회) 및[menu setMenuVisible:animated:].

특히 위의 1-3점이 저를 사로잡았습니다.나는 맞춤형 메뉴 핸들러 수업을 원했는데 그 수업은UIResponder처음에 원인은-becomeFirstResponder돌아오다NO; 그때는.UIView, 하지만 실패했고, 그 다음엔 그 다음엔UIButton효과는 있었지만, 단지userInteractionEnabled기본값:YES단추용으로 그리고.NO위해서UIViews.

UIMenuController보기가 첫 번째 응답자인 경우에만 모든 보기에 표시됩니다.

- (BOOL)canPerformAction메서드 반환YES

따라서 버튼 클릭 시 메뉴 컨트롤러가 표시되어야 한다면 버튼 동작의 첫 번째 줄은 다음과 같습니다.[self becomeFirstResponder]. 참고: 여기 자체가 메뉴를 보여주는 보기입니다.

길게 누르면 메뉴가 표시되는 경우 longPressGesture를 에 추가합니다.UIView그리고 글을 쓰기 전에 긴 프레스 이벤트에서.

[menuController setTargetRect:CGRectMake(50.0, 50.0, 0, 0) inView:self.view];
[menuController setMenuVisible:YES animated:YES];

글을 쓰다[self becomeFirstResponder];

그런 다음 OZ가 언급한 단계를 따릅니다.

다음은 전체 의견을 제시한 작업 예시입니다.

하위 클래스 헤더 파일 보기

#import <Foundation/Foundation.h>

@interface MenuControllerSupportingView : UIView
{

}
@end

하위 클래스 원본 파일 보기

#import "MenuControllerSupportingView.h"

@implementation MenuControllerSupportingView

//It's mandatory and it has to return YES then only u can show menu items..
-(BOOL)canBecomeFirstResponder
{
  return YES;
}

-(void)MenuItemAClicked
{
  NSLog(@"Menu item A clicked");
}

-(void)MenuItemBClicked
{
 NSLog(@"Menu item B clicked");
}

-(void)MenuItemCClicked
{
  NSLog(@"Menu item C clicked");
}

//It's not mandatory for custom menu items

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{  
  if(action == @selector(MenuItemAClicked))
     return YES;
  else if(action == @selector(MenuItemBClicked))
    return YES;
  else if(action == @selector(MenuItemCClicked))
    return YES;
  else
    return NO;
}

컨트롤러 헤더 파일 보기

#import <UIKit/UIKit.h>

@interface ViewController1 : UIViewController

@end

보기컨트롤러 소스 파일

 #import "ViewController1.h"
 #import "MenuControllerSupportingView.h"

@interface ViewController1 ()
{
 MenuControllerSupportingView *vu;
}
@end

@implementation ViewController1

 - (void)viewDidLoad
{
  [super viewDidLoad];

  vu=[[SGGI_MenuControllerSupportingView alloc]initWithFrame:CGRectMake(0,0,768,1024)];

[self.view addSubview:vu];

 UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];

 [btn setFrame:CGRectMake(200,200,200,30)];

 [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

 [btn setTitle:@"Show" forState:UIControlStateNormal];

 [btn addTarget:self action:@selector(SHowMenu) forControlEvents:UIControlEventTouchUpInside];

 [vu addSubview:btn];

}

-(void)SHowMenu
{
 UIMenuController *menucontroller=[UIMenuController sharedMenuController];

UIMenuItem *MenuitemA=[[UIMenuItem alloc] initWithTitle:@"A" action:@selector(MenuItemAClicked)];

UIMenuItem *MenuitemB=[[UIMenuItem alloc] initWithTitle:@"B" action:@selector(MenuItemBClicked)];

UIMenuItem *MenuitemC=[[UIMenuItem alloc] initWithTitle:@"C" action:@selector(MenuItemCClicked)];

[menucontroller setMenuItems:[NSArray arrayWithObjects:MenuitemA,MenuitemB,MenuitemC,nil]];

    //It's mandatory
[vu becomeFirstResponder];

    //It's also mandatory ...remeber we've added a mehod on view class
if([vu canBecomeFirstResponder])
{

    [menucontroller setTargetRect:CGRectMake(10,10, 0, 200) inView:vu];

    [menucontroller setMenuVisible:YES animated:YES];
}

}




-(void)didReceiveMemoryWarning
{
  [super didReceiveMemoryWarning];

}

@end

View 클래스에서 canPerformAction에 반환 YES를 단독으로 작성하면 카메라 기호, 잘라내기, 복사 등과 같은 모든 기본 메뉴 항목이 표시됩니다.

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
 return YES;
}

만약 당신이 혼자 카메라 같은 것을 보여주고 싶다면 그때.

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if(action==@selector(_insertImage:))
     return YES;
else
     return NO;

}

만약 당신이 모든 행동에 대해 알고 싶다면 그때.

링크를 방문합니다.

iOS6에서 특정(및 임의) 문제가 발생하는 경우: 장치에서 Speak Selection(스피크 선택)을 활성화한 것과 관련된 이 SO를 확인할 수 있습니다(설정 -> 일반 -> 접근성 -> Speak Selection(스피크 선택: 켜기).소수의 사용자가 사용자 지정을 볼 수 없었습니다.UIMenuItems그리고 이것이 원인이었습니다.

스위프트 3.0에서 -

제 경우에는 VC에서 텍스트 뷰의 텍스트를 미리 선택하고 사용자가 해당 선택에 대해 조치를 취할 수 있도록 사용자 정의 메뉴를 표시하고 싶었습니다.칼레가 언급한 것처럼, 질서는 매우 중요하며, 특히 만들기는setMenuVisible난.

에서 VC는 에서.viewDidLoad:

menuCont = UIMenuController.shared
let menuItem1: UIMenuItem = UIMenuItem(title: "Text", action: #selector(rtfView.textItem(_:)))
let menuItems: NSArray = [menuItem1]
menuCont.menuItems = menuItems as? [UIMenuItem]

VC에서 사용자가 버튼을 누를 때:

@IBAction func pressed(_ sender: Any) {
    self.textView.selectedRange = NSMakeRange(rangeStart, rangeLength)
    self.textView.becomeFirstResponder()
    menuCont.setTargetRect(CGRect.zero, in: self.textView)
    menuCont.setMenuVisible(true, animated: true)
}

마지막으로 TextView의 하위 클래스에서:

class rtfView: UITextView {

override var canBecomeFirstResponder: Bool {
    return true
}

override func canPerformAction(_ action: Selector, withSender sender: Any!) -> Bool {
    if (action == #selector(textItem(_:))) {
        return true
    } else {
        return false
    }
  }
}

때문일 것입니다.CGRectMake(50.0, 50.0, 0, 0)다를 .CGRect와 함께width = 0그리고.height = 0?

건배, 앙카

언급URL : https://stackoverflow.com/questions/3112925/uimenucontroller-not-showing-up

반응형