LoginSignup
71
71

More than 5 years have passed since last update.

SwiftでUIWebViewを使ってみる

Last updated at Posted at 2014-06-04

追記 2016/02/15

swiftのソースを一部修正しました。(swift2.1対応版)

はじめに

Swiftが発表されたので、簡単なWebviewアプリでも作ってみようと思いましたが、
Xcode6の補完が全く効かず、URLを読み込んだ所で心が折れました。

Swiftでの記述

プロパティを作って、初期化してURLを読み込む。
webviewの宣言をvar webview: UIWebView?でやると
webviewのプロパティにアクセスする度に!をつけろと怒られるので、
宣言したタイミングで初期化すれば怒られなくなりました。

ただ、このタイミングだとviewが作られていないのでinit(frame: CGRect)self.view.boundsとか入れると落ちます。
なのでframeだけ後から指定してみました。

class ViewController: UIViewController ,UIWebViewDelegate{

    //MARK: - Properties
    private var webview: UIWebView!

    //MARK: - View Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()

        webview = UIWebView(frame : self.view.bounds)
        webview.delegate = self;
        self.view.addSubview(webview)

        // NSURLのinitializer(public convenience init?(string URLString: String))は返り値がoptional型なので扱いに注意
        let url = NSURL(string : "http://google.com")
        let urlRequest = NSURLRequest(URL: url!)
        self.webview.loadRequest(urlRequest)
    }

    //MARK: - UIWebViewDelegate
    func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool {
        return true
    }

}

Objective-Cでの記述

@interface WebViewController ()<UIWebViewDelegate>

@property (nonatomic) UIWebView *webview;

@end

@implementation WebViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.webview = [[UIWebView alloc] initWithFrame:self.view.bounds];
    self.webview.delegate = self;
    [self.view addSubview:self.webview];

    NSURL *url = [NSURL URLWithString:@"http://google.com"];
    NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url];
    [self.webview loadRequest:urlRequest];
}

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    return YES;
}

終わりに

全然たいした事していないのに結構ハマってしまった。(!とか?とか)
プロパティはnilを許容すると毎回!とか?とか付けないといけないので、宣言のタイミングで初期化してしまった方が良いような気がしますが、どうなんでしょうか。

基本的にUIKIt周りのアクセス方法はObjective-Cとたいして変わらないのでそんなに困る事は無いかもしれませんが、現状ではコード補完が効かないので不安になります。
Xcode6のSwiftコード補完が使えるようになったら掘り下げてみよう。

71
71
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
71