覆盖 openURL 后无法推送视图控制器

Posted

技术标签:

【中文标题】覆盖 openURL 后无法推送视图控制器【英文标题】:Can't push view controller after overriding openURL 【发布时间】:2013-06-26 16:33:11 【问题描述】:

我正在尝试覆盖我的应用程序的 openURL 方法来拦截 UITextView 中的链接点击。 UITextView 位于基于导航的 DetailViewController 中,当用户单击链接时,我想将 Web 视图推送到导航堆栈上。

我通过将截获的 url 记录到控制台来验证我的方法正在被调用,但导航控制器根本没有推送我的 WebViewController。我在界面生成器中创建了一个按钮,并将其添加到与 textview 相同的视图中,只是为了验证 WebView 是否被推送。该按钮仅用于测试目的。

问题似乎是,当我从 AppDelegate 调用该方法时,navigationController pushViewController 代码没有被触发,即使 NSLog 显示我正在获取有效的截获 url。

感谢您提供的任何帮助!代码:

在 AppDelegate.m 中:

- (BOOL)openURL:(NSURL *)url

    DetailViewController *webView = [[DetailViewController alloc]init];

    webView.url = url;

    [webView push];

    return YES;

DetailViewController.h:

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController <UIGestureRecognizerDelegate>

@property (nonatomic, strong) NSURL *url;

- (void)push;

@end

DetailViewController.m:

- (void)push

    WebViewController *webView = [[WebViewController alloc]    initWithNibName:@"WebViewController" bundle:[NSBundle mainBundle]];

    webView.url = self.url;

    NSLog(@"%@",self.url);

    [self.navigationController pushViewController:webView animated:YES];

【问题讨论】:

当你打电话给pushViewController:animated:时是self.navigationController nil? 看起来是这样,但我不知道为什么,NSLog 确认了它: if(self.navigationController == nil) NSLog(@"uh-oh"); 你在哪里创建你的 UINavigationController?如果您分配/初始化 UIViewController 子类,它不会自动附带导航控制器。 在应用委托中,我使用的是 PKRevealController。我可以整天推送其他详细视图,但我无法推送这个 WebView。正如我在问题中所说,如果我创建一个 UIButton 并将操作连接到该方法,WebView 确实会被推送。 如何访问 DetailViewController 的 navigationController 而不在 AppDelegate 中分配它?我相信这就是问题所在。 【参考方案1】:

我通过使用 NSNotification 解决了这个问题。下面的代码供其他找到此内容的人使用:

AppDelegate.m:

- (BOOL)openURL:(NSURL *)url

    [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"WebViewNotification" object:url]];

    return YES;

DetailViewController.m:

- (void)viewDidLoad

    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(webViewNotification:) name:@"WebViewNotification" object:nil];


- (void)webViewNotification:(NSNotification *)notification

    NSURL *url = [notification object];

    WebViewController *webView = [[WebViewController alloc] initWithNibName:@"WebViewController" bundle:[NSBundle mainBundle]];

    webView.url = url;

    [self.navigationController pushViewController:webView animated:YES];

【讨论】:

以上是关于覆盖 openURL 后无法推送视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

推送视图控制器中的半透明导航栏覆盖?

无法推送或呈现视图控制器

谷歌登录后使用 Swift 4 推送视图控制器

在不知道当前视图状态的情况下实现 openURL

UIScrollview 在向下滚动并推送新的视图控制器后向上移动内容

模态下的弹出/推送视图