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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Swift 2

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

Q&A

解決済

2回答

333閲覧

segueで遷移ができない

KokokaraYoshiki

総合スコア27

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Swift 2

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

0グッド

0クリップ

投稿2017/07/09 08:31

編集2017/07/09 11:04

###前提・実現したいこと
日記アプリを作成しております。
日記の表示画面から文字の入力画面に移動し入力した画面が日記に表示されるようになっております。
tableViewのcellを押した際に詳細ページに移動するようにしたいのですが会のようなエラーになり文字が移動されません

###発生している問題・エラーメッセージ

Could not cast value of type 'goodGlife.CustomTableViewCell' (0x101495008) to 'NSNumber' (0x1019884a8).

###表示画面のコード

// MARK:テーブルビューの作成 @IBOutlet weak var tableView: UITableView! // ⑵行数を決める func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return myTitle.count } // ⑶リストに表示する文字列を決定し、表示 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)as! CustomTableViewCell cell.myTitleLabel.text = myTitle[indexPath.row] cell.myDescriptionLabel.text = myDetail[indexPath.row] cell.myTime.text = myDeta[indexPath.row] let strURL = myImage[indexPath.row] if strURL != nil{ let url = URL(string: strURL as String!) let fetchResult: PHFetchResult = PHAsset.fetchAssets(withALAssetURLs: [url!], options: nil) let asset: PHAsset = (fetchResult.firstObject! as PHAsset) let manager: PHImageManager = PHImageManager() manager.requestImage(for: asset,targetSize: CGSize(width: 5, height: 500),contentMode: .aspectFill,options: nil) { (image, info) -> Void in cell.myImageView.image = image } } cell.accessoryType = .disclosureIndicator return cell } // セグエの設定 設定したセグエの名前を記入 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // どこのセグのどの値をと聞いている↓ performSegue(withIdentifier: "Segue", sender: indexPath.row) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // guestの中身segueに飛んだSecondViewControllerクラスの継承している if (segue.identifier == "Segue") { let guest = segue.destination as! DailyShowViewController guest.mytitle = myTitle[sender! as! Int ] as! String guest.myDetail = myDetail[sender as! Int] as! String guest.myDeta = myImage[sender as! Int] as! String // guest.myDeta = myImage[sender as! Int] as! String } } // データを取ります。 func read(){ // カラの配列を用意します。 myTitle = [] myDetail = [] myDeta = [] myImage = [] // AppDelegateを使う準備 let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate // エンティティを操作するためのオブジェクト let viewContext = appDelegate.persistentContainer.viewContext // どのエンティティからデータを取得してくるか設定 let query: NSFetchRequest<Daily> = Daily.fetchRequest() do{ // データを一括取得 let fetchResults = try viewContext.fetch(query) // データの取得 for result: AnyObject in fetchResults { let title: String! = result.value(forKey: "dailyTitle") as! String let detail: String! = result.value(forKey: "dailyDetail") as! String let deta: NSDate! = result.value(forKey: "deilyDeta") as! NSDate let Img:String! = result.value(forKey: "dailyImage") as! String // print("imgの中身は:\(Img)") let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" //Stringにしたい let detastring:String = formatter.string(from: deta as Date) if title == "" || title == nil || detail == "" || detail == nil{ print("空かnilです") }else{ // MARK:ここオプショナルになるなぜ? print("titleは:\(title)detailは:\(detail)") myTitle.append(title!) myDetail.append(detail!) myDeta.append(detastring) } if Img == "" || Img == nil{ print("画像でいたはカラです。") }else{ myImage.append(Img) } } }catch{ } }

###試したこと
アイデンティティをSegueに指定して移動
DBの確認(データ確認済み)

###追加記入ブレイクポイントでviewdidloadで止まってしまいます。

override func viewDidLoad() { super.viewDidLoad() myLabel.text = mytitle myView.text = myDetail //myDetaところ if myDeta != nil { let strURL = myDeta //strURLのところ if strURL != nil{ let url = URL(string: strURL as String!) let fetchResult: PHFetchResult = PHAsset.fetchAssets(withALAssetURLs: [url!], options: nil) let asset: PHAsset = (fetchResult.firstObject! as PHAsset) let manager: PHImageManager = PHImageManager() manager.requestImage(for: asset,targetSize: CGSize(width: 5, height: 500),contentMode: .aspectFill,options: nil) { (image, info) -> Void in self.myimg.image = image } }

###発生している問題・エラーメッセージWarning

Comparing non-optionalvalue of type String to nik always returns true

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
Swift3 Xcode10.3

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

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

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

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

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

guest

回答2

0

自己解決

遷移先が違っていたために値がsegueに飛んでいませんでした。

投稿2017/07/10 09:42

KokokaraYoshiki

総合スコア27

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

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

0

swift

1guest.mytitle = myTitle[sender! as! Int ] as! String 2guest.myDetail = myDetail[sender as! Int] as! String 3guest.myDeta = myImage[sender as! Int] as! String

の部分を、たとえば

swift

1if let cellRow = tableView.indexPath(for: sender as! CustomTableViewCell)?.row { 2 guest.mytitle = myTitle[cellRow] as! String 3 guest.myDetail = myDetail[cellRow] as! String 4 guest.myDeta = myImage[cellRow] as! String 5}

にしてみるとどうでしょうか?

投稿2017/07/09 10:38

編集2017/07/09 10:49
Bongo

総合スコア10807

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

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

KokokaraYoshiki

2017/07/09 10:53

回答ありがとうざいます。 変更し実行してみたのですがCould not cast value of typeとなってしまいました。 取得時間date型以外は全てString型でcoradetaに保存しているのですが、型変換がうまくいっていないのでしょうか。
Bongo

2017/07/09 11:27

ダメでしたか...「Could not cast...」が出たとき、どの行で停止しているでしょうか?
KokokaraYoshiki

2017/07/09 17:38

if myDeta != nil {省略} if strURL != nil{省略} 上記の部分で停止しております。
Bongo

2017/07/09 19:52

「Comparing non-optional value of type 'String' to nil always returns true」は、直訳すれば「オプショナル型でないStringとnilの比較は、常にtrueを返します」ということで、無意味な条件判定をしていることを指摘しているのかと思います。 Swiftの場合、「?」とか「!」を付けずに宣言した変数にnilを入れることをそもそも許さないので、myDetaやstrURLについてnilかどうかチェックする必要はない(もしnil代入があるなら、この比較部分ではなくて代入部分でエラーを出す)はずです。 「if myDeta != nil」と「if strURL != nil」の比較は両方とも削除して試してみてください。
KokokaraYoshiki

2017/07/10 05:17

回答ありがとうざいます。 上記の通りにしてみたところ, override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // guestの中身segueに飛んだSecondViewControllerクラスの継承している if (segue.identifier == "Segue") { let guest = segue.destination as! DailyShowViewController //エラー guest.mytitle = myTitle[sender! as! Int ] as! String guest.myDetail = myDetail[sender as! Int] as! String guest.myDeta = myImage[sender as! Int] as! String ここまで // guest.myDeta = myImage[sender as! Int] as! String } } Warningで止まってしまいます。 Forced cast of String to same type has no effect
Bongo

2017/07/10 06:24

今度は「Stringを、同じ型(つまりString)に強制型変換(as! String)しても何も起こりません。」といった感じでしょうか。 無駄な型変換を削除せよ、ということで「as! String」をそれぞれ削除してみてください。 ※ちなみに、Xcodeのコードエディタの行の頭に表示されるエラーマーク、警告マークの中には、マークの中心に白丸がついているものがあります。その場合、マークをクリックすると現れるメニューに「Fix-it」と書かれた修正候補が表示されますので、それを選ぶとその候補のように修正を加えてくれます。 ただ、さすがにプログラマーの意図まで完璧に察してくれるものではないので、不適切な修正を行ってしまうこともあるでしょう。 エラーの意味するところと、修正前後でどのように動作が変化するかは十分調べておくことをおすすめします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問