필드를 변경하지 않고 텍스트 뷰를 사용하도록 변경 한 SLTextField + Autocomplete를 사용하여 여러 줄을 만듭니다. 어떤 이유로 기본 코드가 작동하지만 TextView로 이동하면 더 이상 수퍼 뷰에 UIMenuController가 표시되지 않습니다. 아래에 코드가 첨부되어 있습니다. 데이터 소스가 초기화시 슈퍼 뷰에 설정되고 일치하는 항목이 올바르게 작동하면 메뉴가보기에 표시되지 않습니다. 첫 번째 응답자를 UITextView에 할당하는 것은 예상대로 작동합니다 (UIMenuController의 요구 사항에 따라)./아래/어떤 옆에 당신이 메뉴를 표시 할 이상UIMenuController 하위 뷰 UITextView에서 표시하지 않습니다.
//
// SLTextField+Autocomplete.m
// TMSTaxi
//
// Created by Laurent Spinelli on 13/08/12.
// Copyright (c) 2012 Elemasoft. All rights reserved.
//
#import "SLTextField+Autocomplete.h"
@implementation SLTextField_Autocomplete
@synthesize completionMenu;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
completionMenu = [UIMenuController sharedMenuController];
}
return self;
}
- (void)dealloc
{
}
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
NSString *sel = NSStringFromSelector(action);
NSRange match = [sel rangeOfString:@"magic_"];
if (match.location == 0) {
return YES;
}
return NO;
}
- (BOOL) canBecomeFirstResponder
{
NSLog(@"HERE");
return YES;
}
- (void)showAutocompleteItems:(NSString*)_string
{
[self becomeFirstResponder];
NSMutableArray* menuItems = [[NSMutableArray alloc] init];
NSInteger counter = 0;
for (NSString* value in self.dataSource) {
if ([value rangeOfString:_string options:NSCaseInsensitiveSearch].location == 0) {
NSString *sel = [NSString stringWithFormat:@"magic_%@", value];
[menuItems addObject:[[UIMenuItem alloc] initWithTitle:[value capitalizedString] action:NSSelectorFromString(sel)]];
counter ++;
}
if (counter >= SLTextFieldMaxItemToDisplay) {
break;
}
}
[completionMenu setTargetRect:CGRectMake(self.bounds.origin.x,self.bounds.origin.y,70,70) inView:self.superview];
[self becomeFirstResponder];
[completionMenu setMenuItems:menuItems];
[completionMenu setArrowDirection:UIMenuControllerArrowDown];
NSAssert([self becomeFirstResponder], @"Sorry, UIMenuController will not work with %@ since it cannot become first responder", self);
[completionMenu setMenuVisible:YES animated:YES];
//[self performSelector:@selector(doShowMenu) withObject:nil afterDelay:0.5];
}
- (void)doShowMenu
{
}
- (void)tappedMenuItem:(NSString *)_string {
self.text = [_string capitalizedString];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
if ([super methodSignatureForSelector:sel]) {
return [super methodSignatureForSelector:sel];
}
return [super methodSignatureForSelector:@selector(tappedMenuItem:)];
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
NSString *sel = NSStringFromSelector([invocation selector]);
NSRange match = [sel rangeOfString:@"magic_"];
if (match.location == 0) {
[self tappedMenuItem:[sel substringFromIndex:6]];
} else {
[super forwardInvocation:invocation];
}
}
@end
는 일년 전에, 당신이 당신의 자신의 질문에 지금 대답 할 수 있어요? – franck