UIMenuController не отображается из подвида UITextView

Я использую SLTextField + Autocomplete, который я изменил, чтобы использовать текстовое представление вместо поля, чтобы сделать его многострочным. По какой-то причине код по умолчанию работает, но когда я перехожу к TextView, он больше не показывает UIMenuController в супервизоре. Код прикреплен ниже, источник данных установлен в супервизоре при инициализации и поиск совпадений работает корректно, меню просто не будет отображаться в представлении. Назначение первого респондента UITextView работает, как и ожидалось (согласно требованию UIMenuController).

//
//  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

person Nick Pirollo    schedule 14.03.2013    source источник
comment
это было год назад, вы можете сейчас ответить на свой вопрос?   -  person franck    schedule 16.04.2014


Ответы (2)


Изменить это

[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];
person sbarow    schedule 15.03.2013
comment
Это, похоже, не решает проблему. Self - это UITextView, поэтому я предполагаю, что он не хочет показывать меню внутри себя? Должен ли я переместить селекторы в супервизор (обычный UIViewController), а затем посмотреть, работает ли self.superview? Раньше не было. - person Nick Pirollo; 15.03.2013

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

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

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

на это: [completionMenu setTargetRect:self.frame inView:self.superview];

person Koushik Ravikumar    schedule 20.11.2014