UIViewControllerのviewWillAppearの中でUIWebViewに対してバンドル内のリソースを読み込もうとすると、エラーが起きた。しかも、実機では狙った通り動くのに、iOSシミュレーターでのみエラーが起きる。書いたコードは以下の通り。
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:path]]; [self.webView loadRequest:request]; }
起きたエラーは次の通り。
*** WebKit discarded an uncaught exception in the webView:decidePolicyForNavigationAction:request:frame:decisionListener: delegate:*** -[NSRegularExpression enumerateMatchesInString:options:range:usingBlock:]: nil argument
解決編
NSURLの使い方が間違っていた。+ (id)URLWithString:(NSString *)URLString
は、RFC 2396に準拠したURIのみ書ける。ファイルシステム上のパスを書きたい場合は、+ (id)fileURLWithPath:(NSString *)path
を使うべきだった。以下のように直すと正常に動いた。
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]; [self.webView loadRequest:request]; }
Developer LibraryのNSURLのページにも以下のように書いてあった。
+ (id)URLWithString:(NSString *)URLString
Parameters
URLString
The string with which to initialize the NSURL object. Must be a URL that conforms to RFC 2396. This method parses URLString according to RFCs 1738 and 1808. (To create NSURL objects for file system paths, use fileURLWithPath:isDirectory: instead.)