質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

2532閲覧

exc_bad_instruction code=exc_i386_invopエラーの解決方法

sori-

総合スコア37

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/02/15 14:17

編集2016/02/22 12:44

http://qiita.com/stm3/items/7293c54762afeeb10ed5
こちらのサイトを参考にし、URLを読み込むコードを実装し、実行した場合以下のエラーが出ます。

exc_bad_instruction code=exc_i386_invop

output windowにはこちらが
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)

swift

1import UIKit 2 3class DetailController: UIViewController { 4 var entry = NSDictionary() 5 6 @IBOutlet weak var webView: UIWebView! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 //read URL by webView 12 let url = NSURL(string: self.entry["link"] as! String) 13 let request = NSURLRequest(URL: url!) 14 webView.loadRequest(request) 15 } 16}

nilチェックができていないのでしょうか?
検索しましたが、解決方法がわかりませんでした。
解決方法をご存知の方はご教授頂けると助かります。
申し訳ございませんが、宜しくおねがいします。

---追記---
ViewController

swift

1import UIKit 2 3class ViewController: UITableViewController { 4 var entries = NSArray() 5 6 let newsUrlString = "https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http://rss.itmedia.co.jp/rss/2.0/news_bursts.xml&num=8" 7 8 @IBAction func refresh(sender: AnyObject) { 9 let url = NSURL(string: newsUrlString)! 10 11 let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { data,response, error in 12 13 do { 14 // JSONデータを辞書に変換する 15 let dict = try NSJSONSerialization.JSONObjectWithData(data!, 16 options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 17 18 // /responseData/feed/entriesを取得する 19 guard let responseData = dict["responseData"] as? NSDictionary 20 else {return} 21 guard let feed = responseData["feed"] as? NSDictionary else {return} 22 guard let entries = feed["entries"] as? NSArray else {return} 23 self.entries = entries 24 } catch {} 25 // メインスレッドにスイッチする 26 dispatch_async(dispatch_get_main_queue(), { 27 // テーブルビューを更新する 28 self.tableView.reloadData() 29 }) //in complitionHandler 30 }) 31 task.resume() 32 } 33 34 override func viewDidLoad() { 35 super.viewDidLoad() 36 // Do any additional setup after loading the view, typically from a nib. 37 } 38 39 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 40 return entries.count 41} 42 43 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 44 let cell = tableView.dequeueReusableCellWithIdentifier("news")! as 45 UITableViewCell 46 47 let entry = entries[indexPath.row] as! NSDictionary 48 49 cell.textLabel?.text = entry["title"] as? String 50 51 return cell 52 } 53 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 54 performSegueWithIdentifier("detail", sender: entries[indexPath.row]) 55 } 56 57 // send entry to DetailController 58 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 59 if segue.identifier == "detail" { 60 // get DetailController 61 let detailController = segue.destinationViewController as! DetailController 62 63 // set entry 64 detailController.entry = sender as! NSDictionary 65 } 66 } 67}

DetailController

swift

1import Foundation 2import UIKit 3 4class DetailController: UIViewController { 5 6 7 @IBOutlet weak var webView: UIWebView! 8 9 var entry = NSDictionary() 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 //read URL by webView 15 let url = NSURL(string: self.entry["link"] as! String)! 16 let request = NSURLRequest(URL: url, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 60) 17 webView.loadRequest(request) 18 print(url) 19 } 20}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

entry["link"]にurlを入れておかないとダメっぽいですが、入れてあるのでしょうか?

#追記:URLの確認方法

DetailControllerのviewDidLoad内、urlを生成しているところにprintを追加します。

swift

1let url = NSURL(string: self.entry["link"] as! String) 2print(url)

これでURLが正しいか確認してみて下さい。
コピペしてブラウザで正常に表示できるかどうか試してみるのも良いでしょう。

#追記:WebViewのキャッシュを無効にする

NSURLRequestの生成時にキャッシュ無効の設定を行います。

swift

1//let request = NSURLRequest(URL: url!) //←これの代わりに↓を使う 2let request = NSURLRequest(URL: url!, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 60)

投稿2016/02/15 15:52

編集2016/02/22 01:01
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sori-

2016/02/16 14:53

let url = NSURL(string: self.entry["https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http://rss.itmedia.co.jp/rss/2.0/news_bursts.xml&num=8"] as! String) 記述してあるよう、entry["link"]とそのまま書いています。 上記のような記述方法であっていますでしょうか? 実行した場合、上記と同様のエラーが出ます。 申し訳ございませんが、宜しくお願いします。 実装はリンク先の実装と同じコードです。
fuzzball

2016/02/16 15:01

entry["link"] というのは、entryの中の "link" というキーの値を取り出すという意味なので、本当にそのまま entry["link"] と書かなければいけません。リンク(URL)を書くという意味ではありません。urlへの代入は、参考にされたサイトのままでいいはずです。
sori-

2016/02/16 15:53 編集

ご回答いただきありがとうございます。 viewcontrollerに以下のコードでurlは設定できていると思っているのですが、間違いでしょうか。 実行しても、質問した際のエラーが出ます。 無知で申し訳有りません。宜しくお願いいたします。 class ViewController: UITableViewController { var entries = NSArray() let newsUrlString = "https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http://rss.itmedia.co.jp/rss/2.0/news_bursts.xml&num=8" @IBAction func refresh(sender: AnyObject) { let url = NSURL(string: newsUrlString)!
fuzzball

2016/02/16 16:08 編集

参考サイトの記事をサラっと読んでみました。 ViewController側にprepareForSegueは書いてますか? prepareForSegueの、 detailController.entry = sender as NSDictionary ここでDetailControllerのentryにデータを渡しています。 DetailControllerのviewDidLoadの最初の行に、 print(entry) と書いておけば、DetailControllerに遷移した時点でのentryの中身をログで確認できます。
sori-

2016/02/17 14:24 編集

ご丁寧に回答していただきありがとうございます。 >ViewController側にprepareForSegueは書いてますか? ViewControllerに以下を実装しています。 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { performSegueWithIdentifier("detail", sender: entries[indexPath.row]) } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "datail" { let detailController = segue.destinationViewController as! DetailController detailController.entry = sender as! NSDictionary } } } entryの中身はoutputに出力されるものでしょうか? @IBOutlet weak var webView: UIWebView! override func viewDidLoad() { print(entry) super.viewDidLoad() このように記述した場合、outputウィンドウには { } fatal error: unexpectedly found nil while unwrapping an Optional value こちらが表示されます。 申し訳ございませんが、宜しくお願いします。 自分でも調べ、解決する努力もしてみます。
sori-

2016/02/17 14:35

viewcontrollerの最終行を書き直してみました。 // send entry to DetailController override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "detail" { // get DetailController var detailController = segue.destinationViewController as DetailController // set entry detailController.entry = sender as NSDictionary } } 結果は、テーブルを選択し、いままで落ちていたのが遷移するようになりました。 しかし、遷移先には何も表示されませんでした。 outputウィンドウには 2016-02-17 23:35:18.033 SwiftNews[82195:381274] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file. こちらが表示されました。
sori-

2016/02/17 14:42

連投し申し訳ございません。 ATSの設定をplistを作成し、httpsを許可する設定をすれば表示されると自分の中で思いました。 参考サイトをみても理解に時間がかかりそうなので、明日実行してみます。
sori-

2016/02/20 14:56

お返事遅れまして申し訳ございません。 参考サイトを教えていただきありがとうございます。サイトを見ながらplistに以下を作成し設定しました。 >「NSAppTransportSecurity」をDictionaryで作成し、「NSAllowsArbitraryLoads」をBoolean型としてtrue(YES)にします。 こちらのおかげでApp Transport Security has blockedのエラーは出なくなりましたが、相変わらず画面遷移はするのですが、webviewが表示されません。 他は大丈夫だと思うのですが、もう少し原因を探してみます。 ご回答いただきありがとうございました。
sori-

2016/02/20 15:13 編集

先ほどのinfo.plistでNSApp~ とNSAllows~ を作成するのみで、ソースはなにも書き込まないという認識であっていますでしょうか? tableにデータは取得できており、webviewページが真っ白なので、ソース側に問題があるのでしょうか? 特に何もエラーが出ないので、困っています。 申し訳ございませんが、原因がわかる方法等ご存知であれば、ご教授頂けると助かります。 宜しくお願いいたします。
fuzzball

2016/02/20 19:39 編集

>>info.plistでNSApp~ とNSAllows~ を作成するのみで、ソースはなにも書き込まない この「ソース」というのは何のことでしょうか? 記事の一覧は取得できるけど、記事の内容が表示されないということですよね。 どの記事を選んでもダメなのでしょうか? URLの確認方法について、回答に追記しましたので参照して下さい。 >>特に何もエラーが出ないので、困っています。 こういうときは色んなものをprintしてみましょう :)
sori-

2016/02/21 14:18

ご回答、ご教授ありがとうございます。 >>info.plistでNSApp~ とNSAllows~ を作成するのみで、ソースはなにも書き込まない この「ソース」というのは何のことでしょうか? 説明不足で申し訳ございません。 plistに追加、設定するだけでなく、DetailControllerやViewControllerには何も書き込まないで良いでしょうか?という意味でした。 >>記事の一覧は取得できるけど、記事の内容が表示されないということですよね はい、おっしゃる通りです。 回答に追記していただき、ありがとうございます。 DatailControllerに以下を実装しました。 //read URL by webView let url = NSURL(string: self.entry["link"] as! String) let request = NSURLRequest(URL: url!) print(url) webView.loadRequest(request) } } こちらを実装し、記事一覧から内容へ飛んでみると、outputウィンドウに以下が出力されました。 Optional(http://rss.rssad.jp/rss/artclk/XXtgw_wVjwMW/af99354a2b6e4ef0152cc191627177ca?ul=_aikMm.y9Udi40Aamkyglgvgw9pcrOmv7VtpPsnctGr_861OYffdgpbSYhNp3KwGd2PpVGw1m0aL4JpnVF7NR6UwiWOoAqci_r4e7QOe2B2iDcTX8FlzxsExoJ3iVoXYZXOntgT) 調べてみましたが、一応取得ができている、という状態であっていますでしょうか? 原因の切り分けがはっきりわからず、苦戦しております。 申し訳ございませんが、何かご存知であれば宜しくお願いいたします。
fuzzball

2016/02/22 01:05

>>plistに追加、設定するだけでなく、DetailControllerやViewControllerには何も書き込まないで良いでしょうか? そうです。plist側の設定だけでかまいません。 >>一応取得ができている、という状態であっていますでしょうか? 今、Mac上のブラウザでこのURL(http://rss.〜(中略)〜OntgT)を表示してみましたが正しく表示されましたので問題ないと思います。 他に私が思いつくのはキャッシュくらいでしょうか。キャッシュを無効にする方法を回答に追記しましたので試してみて下さい。 ■ちょっとした質問 Q1. 実機でもシミュレータでも同じ結果(真っ白)でしょうか? Q2. 記事が読み込まれるまで少し時間が掛かりますが、しばらく待ってみても表示されないでしょうか?(とりあえず1分程度待ってみて下さい)
sori-

2016/02/22 12:28

ご回答いただきありがとうございます。 追記していただいた内容をDetailControllerに実装しました。 //read URL by webView let url = NSURL(string: self.entry["link"] as! String)! let request = NSURLRequest(URL: url, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 60) webView.loadRequest(request) print(url) } } 上記を設定し、実行してみると以下のエラーがでました。 http://rss.rssad.jp/rss/artclk/XXtgw_wVjwMW/da7fd17f0b7c9b3f0d1b47faa4a8c04f?ul=Z_2BW.uc4oFCU6AXE2Z_5G6ijBSBptmOqeST3lYBx2..iP5wwg4GFrMqUbIECoSp4RDTS6Z_0zuLUECTuwdvEQq6LL5dBX.tVacj7l3iiiodBdBs2R0zAlKbIQZCF0jUvy9DTGB 質問に関して Q1.実機(iPhone6)で確認しても真っ白の状態です。 Q2.シュミレーターと実機どちらとも1分程度まっても表示されませんでした。 正確なURLを叩けているのに表示されないとなると、storyboardが原因なような気もします。今一度設定を確認してみます。 いろいろとお世話になり本当にありがとうございます。
fuzzball

2016/02/22 12:34

それはエラーではなく、print(url)の出力です。コピペしてPCのブラウザで開いて見て下さい。記事が表示されるはずです。 ここまで来ると私もちょっとお手上げ状態です。WebViewに詳しい人が反応してくれるといいのですが。 新たにプロジェクトを作り直してみるのもいいかも知れませんね。
sori-

2016/02/22 12:46

ありがとうございます。 一応コードを追記いたしました。 一から作成し直してみることにします!
sori-

2016/02/22 13:16

>fuzzballさん プロジェクトを作成し直し、実行したら無事、表示されました!! 表示された時の感動は凄まじいものでした。 fuzzballさんには感謝してもしきれません。本当にありがとうございました。
fuzzball

2016/02/22 13:25

プロジェクトを作り直したら‥というのは結構よくあるパターンでして、もっと早くにお勧めしておくべきでした。なぜ表示されなかったのか気になるところではありますが、とにかく無事に動くようになって良かったです。丸々一週間、お疲れさまでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問