2013-03-14 3 views
1

Я использую SLTextField + Autocomplete, который я изменил, чтобы использовать текстовое поле вместо поля, чтобы сделать его многострочным. По какой-то причине работает код по умолчанию, но когда я перехожу к TextView, он больше не отображает UIMenuController в супервизии. Код прилагается ниже, источник данных устанавливается в супервизии при инициализации, и поиск совпадений работает правильно, меню просто не отображается в представлении. Назначение первого ответчика в UITextView работает так, как ожидалось (согласно требованию UIMenuController).UIMenuController Не показывать из subview 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.bounds.origin.x,self.bounds.origin.y,70,70) inView:self.superview]; 
[self becomeFirstResponder]; 

к этому

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

Это не похоже на проблему. Self - это UITextView, поэтому я предполагаю, что он не хочет отображать меню внутри себя? Должен ли я переместить селектора в супервизор (обычный UIViewController), а затем посмотреть, работает ли self.superview? Это не было раньше. –

0

Мишень Прямоугольник должен быть по существу кадр мнение, над/под/рядом с которым вы хотите, чтобы отобразить меню. Что делать, если вы не задаете собственные значения для ширины и высоты?

Попробуйте это изменить:

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

к этому: [completionMenu setTargetRect:self.frame inView:self.superview];

Смежные вопросы