在iOS 9中,为什么要推送SFSafariViewController而不是以模态方式呈现?

时间:2016-02-25 13:45:06

标签: ios iphone uiviewcontroller ios9 sfsafariviewcontroller

我通过在SFSafariViewController个实例上调用presentViewController:animated:completion:来展示UIViewController

结果是它被推送(从右侧滑入),就好像我在pushViewController:animated:实例上调用UINavigationController一样。我已经验证了这一切都发生在主队列上。并且呈现视图控制器本身不是模态(无论如何都不重要,但是以防万一,我们可以排除它)。

如果我将SFSafariViewController替换为UIViewController,它会按预期工作,它会以模态方式呈现。

weakSelf.oAuthViewController = [[SFSafariViewController alloc] initWithURL:url];
[viewController presentViewController:weakSelf.oAuthViewController animated:YES completion:nil];

知道为什么或如何解决这个问题?

4 个答案:

答案 0 :(得分:35)

以下是获取$('#resultstbl tr[id=nameoftr]').remove(); 的垂直模态演示的简单方法:

{{1}}

答案 1 :(得分:23)

我遇到了同样的问题。此外,即使您没有设置委托,完成按钮也能正常工作。不知道为什么会这样。但是,我找到了一种解决方法:将safari控制器包装在导航控制器中并隐藏导航栏。

func openURL(url:NSURL) {

    if #available(iOS 9.0, *) {
        let safariController = SFSafariViewController(url: url)
        safariController.delegate = self
        let navigationController = UINavigationController(rootViewController: safariController)
        navigationController.setNavigationBarHidden(true, animated: false)
        self.present(navigationController, animated: true, completion: nil)
    } else {
        UIApplication.sharedApplication().openURL(url)
    }
}

答案 2 :(得分:8)

要使用默认的模态转换样式,您只需将转换委托设置为等于self。

let svc = SFSafariViewController(url: url)
svc.transitioningDelegate = self //use default modal presentation instead of push
present(svc, animated: true, completion: nil)

您需要在视图控制器中采用UIViewControllerTransitioningDelegate协议,但不需要实现所需的功能。

Session 225 at WWDC, What's New in Safari View Controller中提到了这一点。

答案 3 :(得分:7)

iGerms的Objective-C版本答案:

-(void)openURL:(NSURL *)url {
   SFSafariViewController *safariController = [[SFSafariViewController alloc]initWithURL:url];
   safariController.delegate = self;
   UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:safariController];
   [navigationController setNavigationBarHidden:YES animated:NO];
   [self presentViewController:navigationController animated:YES completion:nil];
}