繁体   English   中英

iOS:弹出菜单的行为与第一响应者设置不符

[英]iOS: Pop-up menu does not behave in accordance with first responder set

我有几个在我的应用程序中继承UIView对象,它们跟踪它们上的点击并显示复制/粘贴弹出窗口,如果它们包含一些特定数据。 当弹出窗口时,我也改变了对象的外观。

这是它的实现方式:

- (void)viewDidReceiveSingleTap:(NSNotification *)n {
    MyObject *mo = (MyObject *)n.object;

    [mo becomeFirstResponder];
    UIMenuController *menu = [UIMenuController sharedMenuController];
    [menu update];

    [menu setTargetRect:CGRectMake(...) inView:mo];

    [menu setMenuVisible:YES animated:YES];
}

反过来, MyObject类定义了canBecomeFirstResponder:canResignFirstResponder:总是返回YES becomeFirstResponder: , resignFirstResponder: ,和canPerformAction:withSender:也相应地定义(这是我改变对象外观的地方)。

这是出了什么问题:

我点击对象1.方法viewDidReceiveSingleTap:上面被调用,对象的canBecomeFirstResponder:becomeFirstResponder:也被调用了。 弹出菜单按预期显示。

我点击另一个对象2. viewDidReceiveSingleTap:再次被调用,这里是麻烦开始的地方。 首先, canResignFirstResponder:对象1的canResignFirstResponder:resignFirstResponder:但不总是,我无法弄清楚模式。 canBecomeFirstResponder:becomeFirstResponder:正确调用对象2,但弹出菜单不重定位。 它只是消失了(虽然在viewDidReceiveSingleTap:我明确地调用setMenuVisible:YES )。 为了使它出现,我必须再次点击对象2(或任何其他) - 在这种情况下,我可以从调试器看到对象2被设置为第一响应者,它只是弹出窗口不是出现。

我究竟做错了什么? 关于弹出菜单可见性和第一响应者之间关系的任何线索?

问题是,当你点击菜单上的任何地方时,它会自动隐藏动画。 隐藏优先于你的动画节目。 因此,如果您点按视图以显示菜单,请点击其他任何地方(在其他任何一个视图或其他任何地方),然后点按其中一个视图,菜单将每次显示。

我认为保持这种行为是一个很好的论据,因为它是用户期望的标准行为。 但是,当然,您可以更好地了解对您的应用程序有意义的内容。 所以,这是诀窍:

[menu setMenuVisible:NO animated:NO];
[menu setMenuVisible:YES animated:YES];

这是我用来试用的代码:

@implementation MenuView

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor blueColor];
    }
    return self;
}


- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [self becomeFirstResponder];
    UIMenuController *menu = [UIMenuController sharedMenuController];
    UIMenuItem *item = [UIMenuItem alloc] initWithTitle:@"Test"
                                                 action:@selector(test)];
    NSArray *items = [NSArray arrayWithObject:item];
    [item release];
    [menu setMenuItems:items];

    [menu setTargetRect:self.bounds inView:self];

    [menu setMenuVisible:NO animated:NO];
    [menu setMenuVisible:YES animated:YES];
}

- (void)test {
    NSLog(@"Test!");
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    return action == @selector(test);
}

- (BOOL)canBecomeFirstResponder {
    NSLog(@"Can become called");
    return YES;
}

- (BOOL)canResignFirstResponder {
    NSLog(@"Can resign called");
    return YES;
}

- (BOOL)becomeFirstResponder {
    [super becomeFirstResponder];
    NSLog(@"Become called");

    return YES;
}

- (void)dealloc {
    [super dealloc];
}


@end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM