Help us understand the problem. What is going on with this article?

SwiftでUIWebViewを使ってみる

More than 3 years have passed since last update.

追記 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コード補完が使えるようになったら掘り下げてみよう。

peromasamune
iOSがメインです(swift,Objective-C)。たまにAndroid、サーバーサイドなど(PHP, Ruby)
http://peromasamune.hateblo.jp/
yumemi
みんなが知ってるあのサービス、実はゆめみが作ってます。スマホアプリ/Webサービスの企画・UX/UI設計、開発運用。Swift, Kotlin, PHP, Vue.js, React.js, Node.js, AWS等エンジニア・クリエイターの会社です。Twitterで情報配信中https://twitter.com/yumemiinc
http://www.yumemi.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away