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

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

ただいまの
回答率

92.00%

  • Swift

    3569questions

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

  • Xcode

    2071questions

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

  • iPhone

    556questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

TableViewのセル番号を検索後にも使用したい。

受付中

回答 1

投稿 2017/02/17 20:53 ・編集 2017/02/18 01:03

  • 評価
  • クリップ 0
  • VIEW 85

bacchi

score 7

前提・実現したいこと

Swiftで、星座一覧から星座を選択すると次の画面に遷移してその星座を探せるようなアプリを作っています。(ViewController間でのデータの受け渡しにはAppDelegateを用いた方法を採用し、星座一覧でのセル番号をseizaNum変数に代入してそれを次の画面でも使用しています。)
星座を選択する画面は、以前はTableViewだけでしたが、SearchControllerをくっつけて検索もできるようにしたいと思っています。

発生している問題

検索せずにTableViewから直接選択したときは以前と同様にセルをタップすると画面遷移するのですが、検索結果から選択すると画面遷移できませんでした。

検索前と検索後でそれぞれの星座のセル番号が変わってしまうと思いますが、何か良い方法はないでしょうか?
どうかよろしくお願いします。

星座選択画面のソースコード

import UIKit

class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating {

    @IBOutlet weak var Label2: UILabel!
    @IBOutlet weak var tableView: UITableView!


    private let myItems: [String] = ["アンドロメダ座", "いっかくじゅう座", "いて座", "いるか座", "うお座", "うさぎ座", "うしかい座", "うみへび座", "エリダヌス座", "おうし座", "おおいぬ座", "おおぐま座", "おとめ座", "おひつじ座", "オリオン座", "カシオペア座", "かに座", "かみのけ座", "からす座", "かんむり座", "ぎょしゃ座", "きりん座", "くじら座", "ケフェウス座", "けんびきょう座", "こいぬ座", "こうま座", "こぎつね座", "こぐま座", "こじし座", "コップ座", "こと座", "さそり座", "さんかく座", "しし座", "たて座", "ちょうこくぐ座", "ちょうこくしつ座", "つる座", "てんびん座", "とかげ座", "はくちょう座", "はと座", "ふたご座", "ペガスス座", "へび座", "へびつかい座", "ヘルクレス座", "ペルセウス座", "ポンプ座", "みずがめ座", "みなみのうお座", "みなみのかんむり座", "や座", "やぎ座", "やまねこ座", "りゅう座", "りょうけん座", "ろ座", "ろくぶんぎ座", "わし座"]

    var searchResults: [String] = []

    var searchController = UISearchController()


    override func viewDidLoad() {
        super.viewDidLoad()

        Label2.text = "探したい星座を選ぼう!"

        searchController = UISearchController(searchResultsController: nil)

        searchController.searchResultsUpdater = self

        searchController.searchBar.sizeToFit()

        searchController.dimsBackgroundDuringPresentation = false

        searchController.hidesNavigationBarDuringPresentation = false

        tableView.tableHeaderView = searchController.searchBar
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    // Cellの総数を返す
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if searchController.isActive {
            return searchResults.count
        } else {
            return myItems.count
        }
    }


    // Cellに値を設定する
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath)

        if searchController.isActive {
            cell.textLabel!.text = "\(searchResults[indexPath.row])"
        } else {
            cell.textLabel!.text = "\(myItems[indexPath.row])"
        }

        return cell
    }


    // 検索文字列変更時に呼び出される
    func updateSearchResults(for searchController: UISearchController) {

        //検索文字列を含むデータを検索結果配列に格納する
        self.searchResults = myItems.filter {
            $0.lowercased().contains(searchController.searchBar.text!.lowercased())
        }

        //テーブルビューを再読み込みする
        self.tableView.reloadData()
    }


    // Cellが選択された際に呼び出される
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        // ThirdViewControllerへ画面遷移
        let storyboard: UIStoryboard = self.storyboard!
        let nextView = storyboard.instantiateViewController(withIdentifier: "third") as! ThirdViewController

        // 選択されたCellの番号をseizaNum変数に代入する
        let seizaNum = indexPath.row

        let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.seizaNum = seizaNum

        self.present(nextView, animated: true, completion: nil)
    }

}

画面遷移後のソースコード

import UIKit
import CoreMotion
import CoreLocation
import AudioToolbox


class ThirdViewController: UIViewController, CLLocationManagerDelegate  {

    @IBOutlet weak var LabelMyStr: UILabel!
    @IBOutlet weak var Label3: UILabel!
    @IBOutlet weak var Label4: UILabel!


    // 座標(0,0)の位置にUIImageViewを幅300,高さ300で作成する
    let myImageView = UIImageView(frame: CGRect(x:0, y:0, width:300, height:300))

    var myMotionManager: CMMotionManager!
    var locationMgr: CLLocationManager!

    var myImage: UIImage!

    var aY2: Double!
    var MJD2: Double!
    var δ: Double!
    var α: Double!
    var deg_A2: Double!
    var deg_h: Double!
    var difY: Double!
    var seizaNum: Int!


    override func viewDidLoad() {
        super.viewDidLoad()

        // seizaNum変数を受け取る
        let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
        self.seizaNum = appDelegate.seizaNum


        // 探したい星座の赤緯(δ[度])、赤経(α[時])(※星座の概略位置)
        // アンドロメダ座
        if self.seizaNum == 0 {
            self.δ = 38.0
            self.α = 0.0 + 40.0/60.0

            Label3.text = "アンドロメダ座"

            self.myImage = UIImage(named: "andoromeda.jpg")
        }
        // いっかくじゅう座
        if self.seizaNum == 1 {
            self.δ = -5.74
            self.α = 7.15

            Label3.text = "いっかくじゅう座"

            self.myImage = UIImage(named: "ikkakuju.jpg")
        }
        // いて座
        if self.seizaNum == 2 {
            self.δ = -25.0
            self.α = 19.0

            Label3.text = "いて座"

            self.myImage = UIImage(named: "ite.jpg")
        }
        // いるか座
        if self.seizaNum == 3 {
            self.δ = 13.8
            self.α = 20.7

            Label3.text = "いるか座"

            self.myImage = UIImage(named: "iruka.jpg")
        }
        // うお座
        else if self.seizaNum == 4 {
            self.δ = 15.0
            self.α = 1.0

            Label3.text = "うお座"

            self.myImage = UIImage(named: "uo.jpg")
        }
        // うさぎ座
        else if self.seizaNum == 5 {
            self.δ = -20.0
            self.α = 6.0

            Label3.text = "うさぎ座"

            self.myImage = UIImage(named: "usagi.jpg")
        }
        // うしかい座
        if self.seizaNum == 6 {
            self.δ = 30.0
            self.α = 15.0

            Label3.text = "うしかい座"

            self.myImage = UIImage(named: "ushikaijpg")
        }

// 以下省略

試したこと

受け渡す変数をseizaとし、searchResults[indexPath.row]とmyItems[indexPath.row]の両方をsearchController.isActiveの時とそうでない時のそれぞれで代入し、それを画面遷移後にseiza == "アンドロメダ座"のとき、、、というふうにしてみました。
しかし、検索しないときはきちんと画面遷移しましたが、検索しその結果から星座を選択したときはやはり遷移できませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

Swift3.0/Xcode8.2.1/iOS10.2.1

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

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

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

受け渡す変数をseizaとし、searchResults[indexPath.row]とmyItems[indexPath.row]の両方をsearchController.isActiveの時とそうでない時のそれぞれで代入し、それを画面遷移後にseiza == "アンドロメダ座"のとき、、、というふうにしてみました。 
しかし、検索しないときはきちんと画面遷移しましたが、検索しその結果から星座を選択したときはやはり遷移できませんでした。

この方法で良さそうに思います。これでうまくいかないなら、
そのうまくいかないコードを提示して質問したら、
具体的なコードの問題を指摘できると思います。

投稿 2017/02/20 03:44

編集 2017/02/20 04:03

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

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

ただいまの回答率

92.00%

関連した質問

同じタグがついた質問を見る

  • Swift

    3569questions

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

  • Xcode

    2071questions

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

  • iPhone

    556questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

閲覧数の多いXcodeの質問