【问题标题】:how to disable hyperlink and copy/paste menu on iOS and webviewdidfinishload not called如何在 iOS 和 webviewdifinishload 上禁用超链接和复制/粘贴菜单未调用
【发布时间】:2013-02-09 08:25:10
【问题描述】:

我正在尝试禁用 iOS UIwebview 上的超链接和复制/粘贴菜单 所以我用谷歌搜索,有很多答案。 然后我遇到了另一个问题“未调用 webviewdidfinishload” 所以我添加我的代码来寻求你的帮助。 (我确定我正确连接了 IBOutlet)

另外,我仍然没有想到将 mainWebView.delegate = self 代替 self.mainWebView.delegate = self 谁能解释其中的区别? 所以我不确定我的其他功能,比如 [[[mainWebView subviews] lastObject] setScrollEnabled:YES] [[[mainWebView 子视图] lastObject] setScrollsToTop:NO]
mainWebView.scalesPageToFit = YES 这些是否有效。

它应该适用于 ios5 到 ios6.1 谢谢

在.h文件中

@interface HRViewController : UIViewController <UIWebViewDelegate>
{
    UIWebView *mainWebView;
}
@property (strong, nonatomic) IBOutlet UIWebView *mainWebView;

@end

在 .m 文件中

@interface HRViewController ()

@end

@implementation HRViewController

@synthesize mainWebView;

- (void)viewDidLoad
{
    [self startWebView];
    [super viewDidLoad];
}

- (void)startWebView
{
    mainWebView.delegate = self;

    [[[mainWebView subviews] lastObject] setScrollEnabled:YES];
    [[[mainWebView subviews] lastObject] setScrollsToTop:NO]; 
    mainWebView.scalesPageToFit = YES;

    mainWebView = [[UIWebView alloc] initWithFrame:self.view.bounds];
    mainWebView.scalesPageToFit = YES;
    [self.view addSubview:self.mainWebView];

    NSURL *url = [NSURL URLWithString:/" @"http://www.mysite.com" "/];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [mainWebView loadRequest:request];
}

- (void)webViewDidFinishLoad:(UIWebView *)WebView {
    NSLog(@"finish");

    [WebView stringByEvaluatingJavaScriptFromString: @"document.documentElement.style.webkitUserSelect='none';"];
    [WebView stringByEvaluatingJavaScriptFromString: @"document.documentElement.style.webkitTouchCallout='none';"];
}

- (void)webViewDidStartLoad:(UIWebView *)mainWebView {
    NSLog(@"start");
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    NSLog(@"Error for WEBVIEW: %@", [error description]);
}

EDIED 我使用了以下代码,但仍然无法正常工作... 这些都不行!!!!!!

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    NSLog(@"canPerformAction: %@",NSStringFromSelector(action));
    if (action == @selector(copy:) ||
        action == @selector(paste:)||
        action == @selector(cut:)) {
        return NO;
    }
    return NO;
}

还有这个

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    UIMenuController *menuController = [UIMenuController sharedMenuController];
    if (menuController) {
        [UIMenuController sharedMenuController].menuVisible = NO;
    }
    return NO;
}

即使这样 - (void)viewDidLoad { mainWebView.delegate = self; }

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"finish");
    // Disable user selection
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
    // Disable callout
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}

还有这个 - (void)viewDidLoad { [自我长按:self.mainWebView]; }

- (void)longPress:(UIView *)webView {
    UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress)];

    longPress.allowableMovement=100;
    longPress.minimumPressDuration=0.3;
    longPress.delaysTouchesBegan=YES;
    longPress.cancelsTouchesInView=YES; 
    [webView addGestureRecognizer:longPress]; 
}

// I just need this for the selector in the gesture recognizer.
- (void)handleLongPress {

}

请帮帮我..这让我疯了一个星期..

【问题讨论】:

    标签: ios uiwebviewdelegate


    【解决方案1】:

    隐藏复制/粘贴菜单:

    重写 canPerformAction:withSender: 方法以返回 NO 用于您不想允许的操作:

    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
    {
        if (action == @selector(paste:))
            return NO;
    
        if (action == @selector(select:))   
            return NO;
    
        if (action == @selector(selectAll:))   
            return NO;
    
        return [super canPerformAction:action withSender:sender];
    }
    

    另一种方式:

    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
    {
        UIMenuController *menuController = [UIMenuController sharedMenuController];
        if (menuController) {
            [UIMenuController sharedMenuController].menuVisible = NO;
        }
        return NO;
    }
    

    同时检查This link

    禁用超链接:

    你可以从this site得到这个问题的答案。

    关于UIWebView

    如果您使用 ARC,则只写,

    @property (strong, nonatomic) IBOutlet UIWebView *mainWebView;
    

    不需要@synthesize属性,否则,

    @interface HRViewController : UIViewController <UIWebViewDelegate>
    {
        UIWebView *mainWebView;
    }
    
    @property (nonatomic,retain) IBOutlet UIWebView *mainWebView;
    
    @end
    
    // .m file
    
    - (void)viewDidLoad
    {
        mainWebView = [[UIWebView alloc] initWithFrame:self.view.bounds];
        mainWebView.scalesPageToFit = YES;
        mainWebView.delegate = self;
    
        [[[mainWebView subviews] lastObject] setScrollEnabled:YES];
        [[[mainWebView subviews] lastObject] setScrollsToTop:NO];
        mainWebView.scalesPageToFit = YES;
    
        [self.view addSubview:self.mainWebView];
    
        NSURL *url = [NSURL URLWithString:@"http://www.mysite.com"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [mainWebView loadRequest:request];
    }
    

    这可能对你有帮助。

    【讨论】:

    • 感谢您的回答。不幸的是,它仍然对我不起作用。我都试过了,但没有任何效果。我什至禁用了长按手势但不起作用。将 javascript 添加到 CSS 也不起作用.. 我不知道这个问题,但它让我发疯.. 但现在一个进步是 webViewDidFinishLoad 被调用(nslog comfirmed。)需要额外的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2014-11-29
    • 2011-10-04
    • 2018-02-24
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多