用于NSDataDetector的iOS UIActionSheet和双模态视图

时间:2015-01-08 18:24:38

标签: objective-c ios7 uiviewcontroller uiactionsheet

我在iOS 7和iPhone中检测到的号码存在问题,当用户长时间点击操作系统检测到的号码时,它会提示UIActionSheet,其中包含以下选项:" Call",&#34 ;发送消息","添加到联系人","复制"和"取消"。我面临的问题是,当选项"发送消息"或"添加到联系人"点击后,操作系统在我当前的模态视图上创建一个模态视图,这导致第二个模态视图的导航栏无法正确显示。

考虑到这一点,我无法断言用户在哪个时刻点击了哪个按钮,因为不是我创建了UIActionSheet(iOS自己),然后我无法接收任何类型的委托方法。发送到UIViewController的唯一消息是:

      -(BOOL)textView:(UITextView *)textView 
shouldInteractWithURL:(NSURL *)URL 
              inRange:(NSRange)characterRange

它告诉我用户一次点击了哪种数据(但没有长时间点击)。我尝试了方法调用:

-(void)viewWillDisappear:(BOOL)animated
-(void)viewDidDisappear:(BOOL)animated

不幸的是,它们永远不会在iOS7上调用,而iOS8则会调用它们。这让我得出结论,到目前为止,这个问题只与iOS7有关,我使用的是带有iOS 7.1.2的iPhone 4。当我在iOS8中尝试相同的情况时,第二个模态视图正确呈现,放在我当前视图的顶部。

我希望有人有更多信息或其他想法。

谢谢!

iOS UIActionSheet for the phone Wrong navigation bar, it lies on top of the normal "Add contacts" navigation bar

1 个答案:

答案 0 :(得分:0)

我最终申请的解决方案是完全避免生成要显示的操作表的标题号上的长按手势。我检查了单元格内的UITextView的手势识别器列表,然后查找属于类UILongPressGestureRecognizer的那个,我只是禁用了朋友手势。代码片段是:

RestrictedTextView.h

#import <UIKit/UIKit.h>

@interface RestrictedTextView : UITextView

@end

RestrictedTextView.m

#import "RestrictedTextView.h"

NSString *const kFriendsStringInGesture = @"friends";

@implementation RestrictedTextView

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if ([[gestureRecognizer class] isEqual:[UILongPressGestureRecognizer class]])
    {
        UILongPressGestureRecognizer *longPress = (UILongPressGestureRecognizer *)gestureRecognizer;
        longPress.enabled = YES;
        if ([longPress valueForKey:kFriendsStringInGesture] != nil)
        {
            UILongPressGestureRecognizer *friendLongPress = (UILongPressGestureRecognizer *)[[longPress valueForKey:@"friends"] anyObject];
            friendLongPress.enabled = NO;
        }
    }

    return YES;
}

@end