2013-03-14 2 views
1

필드를 변경하지 않고 텍스트 뷰를 사용하도록 변경 한 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 
+0

는 일년 전에, 당신이 당신의 자신의 질문에 지금 대답 할 수 있어요? – franck

답변

0

변경이

[completionMenu setTargetRect:CGRectMake(self.frame.origin.x,self.frame.origin.y,70,70) inView:self]; 
+0

이 문제가 해결되지 않는 것 같습니다. 셀프 자체가 UITextView이므로 내부에 메뉴를 표시하고 싶지 않다고 가정하고 있습니까? 선택기를 superview (일반 UIViewController)로 이동 한 다음 self.superview가 작동하는지 확인해야합니까? 전에는 없었습니다. –

0

[completionMenu setTargetRect:CGRectMake(self.bounds.origin.x,self.bounds.origin.y,70,70) inView:self.superview]; 
[self becomeFirstResponder]; 

대상 RECT는 기본적으로 뷰의 프레임 수 있어야합니다. 너비와 높이에 대한 맞춤 값을 제공하지 않으면 어떻게 될까요? 이 변경

시도 : 이것에

[completionMenu setTargetRect:CGRectMake(self.bounds.origin.x,self.bounds.origin.y,70,70) inView:self.superview];

: [completionMenu setTargetRect:self.frame inView:self.superview];

관련 문제