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];
오류나 예외는 없지만 메뉴 컨트롤러가 나타나지 않을 뿐입니다.
다음 세 가지를 수행해야 합니다.
- 뷰 또는 뷰 컨트롤러를 호출해야 합니다.
- 뷰 또는 뷰 컨트롤러를 구현해야 합니다(복귀).
YES). - 선택적으로 보기 또는 보기 컨트롤러는 개별적으로 메뉴 항목을 표시/숨기기 위해 구현할 수 있습니다.
답에는 세 가지가 언급되어 있지만, 까다롭게 말하면, 여섯 가지가 있습니다.
- 메뉴 처리기는 UIView여야 합니다.그렇지 않다면,
-becomeFirstResponder실패. - 메뉴 핸들러는 다음을 수행해야 합니다.
userInteractionEnabled = YES - 메뉴 처리기는 보기 계층 및 보기 계층에 있어야 합니다.
-window속성은 뷰에 대한 창과 동일해야 합니다.inView:논쟁. - 구현해야 합니다.
-canBecomeFirstResponder그리고 돌아오세요YES. - 전화를 해야합니다.
[handler becomeFirstResponder], 전에[menu setTargetRect:inView:]가 호출됩니다. 그렇지 않으면 후자가 실패합니다. - 전화를 해야합니다.
[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
'programing' 카테고리의 다른 글
| 이름별 쿼리 테이블 개체 참조 (0) | 2023.09.20 |
|---|---|
| Invocation of init method failed; nested exception for a second one to many (0) | 2023.09.20 |
| 데이터가 존재하는 행 수 (0) | 2023.09.20 |
| Python: Excel 2007+ 파일(.xlsx 파일)에 쓰기 (0) | 2023.09.15 |
| 런타임에 Spring bean 정의를 대체할 수 있습니까? (0) | 2023.09.15 |