2 votes

[UIMenuController sharedMenuController].isMenuVisible est toujours NO dans EGOTextView

J'emploie EGOTextView pour faire de l'édition NSAttributedString. Il y a un bogue sur UIMenuController que je n'arrivais pas à oublier. Selon la logique décrite dans le code suivant, l'UIMenu s'affichera et se cachera alternativement après un tap sur l'EGOTextView. Mais le fait est que le [UIMenuController sharedMenuController].isMenuVisible obtiendra toujours NON que le code [menuController setMenuVisible:NO animated:NO]; ne sera jamais appelé. Y a-t-il un point délicat que j'ai manqué ? Merci pour toute suggestion !

EGOTextView.m

- (void)tap:(UITapGestureRecognizer*)gesture {

NSLog(@"[UIMenuController sharedMenuController].isMenuVisible :%d",[UIMenuController sharedMenuController].isMenuVisible);
// It always log 0 even if the UIMenu is visible on the screen.

if (_editable && ![self isFirstResponder]) {
    [self becomeFirstResponder];  
    return;
}

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showMenu) object:nil];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showCorrectionMenu) object:nil];

self.correctionRange = NSMakeRange(NSNotFound, 0);
if (self.selectedRange.length>0) {
    self.selectedRange = NSMakeRange(_selectedRange.location, 0);
}

NSInteger index = [self closestWhiteSpaceIndexToPoint:[gesture locationInView:self]];

if (_delegateRespondsToDidSelectURL && !_editing) {
    if ([self selectedLinkAtIndex:index]) {
        return;
    }
}

UIMenuController *menuController = [UIMenuController sharedMenuController];
NSLog(@"menuController.menuVisible :%d", menuController.menuVisible);

if ([menuController isMenuVisible]) {
// never run into here
    [menuController setMenuVisible:NO animated:NO];

} else {

    if (index==self.selectedRange.location) {
        [self performSelector:@selector(showMenu) withObject:nil afterDelay:0.35f];
    } else {
        if (_editing) {
            [self performSelector:@selector(showCorrectionMenu) withObject:nil afterDelay:0.35f];
        }
    }

}

[self.inputDelegate selectionWillChange:self];

self.markedRange = NSMakeRange(NSNotFound, 0);
self.selectedRange = NSMakeRange(index, 0);

[self.inputDelegate selectionDidChange:self];

}

2voto

anna Points 662

J'ai trouvé le code ci-dessous, et [menuController setMenuVisible:NO animated:NO] ; devrait être le point qui rend invisible UIMenuController.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{

    if ([gestureRecognizer isKindOfClass:NSClassFromString(@"UIScrollViewPanGestureRecognizer")]) {
        UIMenuController *menuController = [UIMenuController sharedMenuController];
        if ([menuController isMenuVisible]) {
            [menuController setMenuVisible:NO animated:NO];
        }
    }

    return NO;

}

La fonction - (void)tap :(UITapGestureRecognizer*)gesture est exécuté après - (BOOL)gestureRecognizer :(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer :(UIGestureRecognizer *)otherGestureRecognizer .

0voto

anna Points 662

Peut-être devriez-vous essayer de chercher "setMenuVisible:NO". Il doit également être écrit quelque part ailleurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X