Ste*_*hen 7 iphone copy first-responder uimenucontroller
我正在创建一个类似于手机上的消息应用程序的iPhone应用程序.我只是设置了通过UIMenuController复制消息的能力,但是如果键盘正在显示并且有人试图复制消息,键盘就会消失(大概是因为我[cell becomeFirstResponder];在哪里cell复制了消息单元).
有没有办法显示复制邮件而不会丢失键盘?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
(NSIndexPath *)indexPath {
//...other cell setup stuff...
UILongPressGestureRecognizer *longPressGesture =
[[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(showCopyDialog:)];
[cell addGestureRecognizer:longPressGesture];
return cell;
}
- (void)showCopyDialog:(UILongPressGestureRecognizer *)gesture
{
if (gesture.state == UIGestureRecognizerStateBegan)
{
ConvoMessageCell *cell = (ConvoMessageCell *)[gesture view];
NSIndexPath *indexPath = [self.tblConvo indexPathForCell:cell];
UIMenuController *theMenu = [UIMenuController sharedMenuController];
[cell becomeFirstResponder];
[theMenu setTargetRect:CGRectMake(menuX, menuY, 100, 100) inView:cell];
[theMenu setMenuVisible:YES animated:YES];
}
}
Run Code Online (Sandbox Code Playgroud)
小智 17
我通过继承UITextView以提供一种覆盖nextResponder并禁用内置操作(Paste)的方法来解决这个难题,如下所示:
@interface CustomResponderTextView : UITextView
@property (nonatomic, weak) UIResponder *overrideNextResponder;
@end
Run Code Online (Sandbox Code Playgroud)
@implementation CustomResponderTextView
@synthesize overrideNextResponder;
- (UIResponder *)nextResponder {
if (overrideNextResponder != nil)
return overrideNextResponder;
else
return [super nextResponder];
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (overrideNextResponder != nil)
return NO;
else
return [super canPerformAction:action withSender:sender];
}
@end
Run Code Online (Sandbox Code Playgroud)
然后,在您的手势操作处理程序中,检查文本视图是否已经是第一个响应者.如果是这样,让它覆盖下一个响应者; 否则键盘可能是隐藏的,你可以简单地becomeFirstResponder.当菜单隐藏时,您还必须重置覆盖:
if ([inputView isFirstResponder]) {
inputView.overrideNextResponder = self;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(menuDidHide:)
name:UIMenuControllerDidHideMenuNotification object:nil];
} else {
[self becomeFirstResponder];
}
- (void)menuDidHide:(NSNotification*)notification {
inputView.overrideNextResponder = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIMenuControllerDidHideMenuNotification object:nil];
}
Run Code Online (Sandbox Code Playgroud)
使用iOS 5中引入的表视图委托方法(shouldShowMenuForRowAtIndexPath等)对我来说不是一个解决方案,因为我需要控制菜单的位置(默认情况下,它只是在单元格上水平居中,但我显示的是消息气泡和希望菜单以实际气泡为中心).
在iOS 5中,您现在可以使用表视图委托方法来显示菜单控制器:
- (BOOL) tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath
- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender;
- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender;
Run Code Online (Sandbox Code Playgroud)
以这种方式显示菜单控制器不会使键盘重新签名.
我仍然对此感到好奇,因为我有一个支持iOS 5之前的应用程序,我也想做你所说的(当出现复制菜单时不要退出键盘).
| 归档时间: |
|
| 查看次数: |
2544 次 |
| 最近记录: |