如何推送SFSafariViewController?

20

当我尝试推送Safari ViewController时,出现了两个奇怪的问题:

  1. 它带有“完成”按钮的地址栏位于我的导航栏下方;

  2. 当我按返回按钮时,代理方法safariViewControllerDidFinish:不会被调用。

我认为苹果不会批准这种行为,所以:

有没有一种方式可以推送Safari ViewController而没有这些问题?


3
文档中没有明确说明,但你只能以模态方式呈现视图,不应将其推入导航控制器。 - rckoenes
2个回答

58
不要使用pushViewController:animated:方法,而是使用presentViewController:animated:completion:方法来推出SFSafariViewController。

Safari视图控制器将会以标准的推出动画来呈现。


26
太奇怪了。 - beebcon

7
除了rckoenes的评论外,我看到的唯一选择是在呈现SFSafariViewController时隐藏导航栏。
import UIKit
import SafariServices

class ViewController: UIViewController {
    @IBAction func openBrowser(sender: AnyObject) {
        let safariViewController = SFSafariViewController(URL: NSURL(string: "http://your.url")!)
        safariViewController.delegate = self

        // hide navigation bar and present safari view controller
        navigationController?.navigationBarHidden = true
        navigationController?.pushViewController(safariViewController, animated: true)
    }
}

extension ViewController: SFSafariViewControllerDelegate {
    func safariViewControllerDidFinish(controller: SFSafariViewController) {
        // pop safari view controller and display navigation bar again
        navigationController?.popViewControllerAnimated(true)
        navigationController?.navigationBarHidden = false
    }
}

推送似乎工作正常,但SFSafariViewController正在解除呈现的视图控制器,有什么方法可以避免它? - Alvaro Rivoir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接