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