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

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

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

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

Swift

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

iPhone

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

Q&A

解決済

2回答

292閲覧

swift3 他のClassからViewControllerマップにピンを立てたい

harima

総合スコア17

Xcode

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

Swift

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

iPhone

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

0グッド

0クリップ

投稿2017/07/20 02:51

subTableVC_1.swiftのクラスからViewController.swiftのマップにピンを立てたいのですが、fatal error: unexpectedly found nil while unwrapping an Optional valueが発生してピンを立てることができません。宜しくお願い申し上げます。

swift

1// ViewController.swift 2 3import UIKit 4import MapKit 5 6class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate { 7 8 @IBAction func fromSubTableVC_1Segue(_ segue:UIStoryboardSegue){} 9 10 var senderFileName : String! 11 12 var myMapView : MKMapView! 13 var myLocationManager : CLLocationManager! 14 15 16 var menuBtn : UIButton! 17 18 // 縮尺. 19 var myLatDist : CLLocationDistance = 10 20 var myLonDist : CLLocationDistance = 10 21 let DEFAULT_DISTANCE : CLLocationDistance = 10 22 23 var center: CLLocationCoordinate2D! 24 25 override func viewDidLoad() { 26 super.viewDidLoad() 27 // Do any additional setup after loading the view, typically from a nib. 28 } 29 30 override func viewWillAppear(_ animated: Bool) { 31 super.viewWillAppear(animated) 32 33 let maxWidth : CGFloat = self.view.bounds.width 34 let maxHeight: CGFloat = self.view.bounds.height 35 36 myMapView = MKMapView() 37 myMapView.frame = self.view.frame(forAlignmentRect: CGRect(x: 0.0, y: 20.0 + 50.0, width: maxWidth, height: maxHeight - 20.0 - 50.0 - 50.0)) 38 myMapView.delegate = self 39 myMapView.setCenter(self.myMapView.userLocation.coordinate, animated: true) 40 myMapView.setUserTrackingMode(.follow, animated: true) 41 myMapView.showsUserLocation = true 42 view.addSubview(self.myMapView) 43 44 menuBtn = UIButton() 45 menuBtn.frame = CGRect(x: maxWidth / 5.0 * 2.0, y: maxHeight - 50.0, width: maxWidth / 5.0, height: 50.0) 46 menuBtn.setTitleColor(UIColor.blue, for: .normal) 47 menuBtn.backgroundColor = UIColor.lightGray 48 menuBtn.layer.cornerRadius = 10.0 49 menuBtn.setTitle("リスト", for: .normal) 50 menuBtn.tag = 4 51 menuBtn.addTarget(self, action: #selector(ViewController.onClickMyButton(sender:)), for: .touchDown) 52 self.view.addSubview(menuBtn) 53 54 myLocationManager = CLLocationManager() 55 myLocationManager.delegate = self 56 myLocationManager.distanceFilter = 100.0 57 myLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters 58 59 myLocationManager.startUpdatingLocation() 60 61 let status = CLLocationManager.authorizationStatus() 62 63 if(status != CLAuthorizationStatus.authorizedWhenInUse){ 64 print("not determined") 65 myLocationManager.requestWhenInUseAuthorization() 66 } 67 68 pin(name: "String", address :"String", lati: 33.002184, long: 130.426536) 69 } 70 71 // GPSから値を取得した際に呼び出されるメソッド. 72 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 73 74 print("didUpdateLocations") 75 76 // 配列から現在座標を取得. 77 let myLocations: NSArray = locations as NSArray 78 let myLastLocation: CLLocation = myLocations.lastObject as! CLLocation 79 let myLocation:CLLocationCoordinate2D = myLastLocation.coordinate 80 81 print("\(myLocation.latitude), \(myLocation.longitude)") 82 83 84 // Regionを作成. 85 let myRegion: MKCoordinateRegion = MKCoordinateRegionMakeWithDistance(myLocation, myLatDist, myLonDist); 86 87 // MapViewに反映. 88 myMapView.setRegion(myRegion, animated: true) 89 } 90 91 // Regionが変更された時に呼び出されるメソッド. 92 func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { 93 print("regionDidChangeAnimated") 94 } 95 96 97 func onClickMyButton(sender: UIButton) { 98 99 if (sender.tag == 4){ 100 self.performSegue(withIdentifier: "toSubTableVC_1Segue", sender: nil) 101 } 102 } 103 104 105 106 func pin(name: String, address :String, lati: Double, long: Double) { 107 108 // 経度、緯度. 109 let myLatitude : CLLocationDegrees = (lati as CLLocationDegrees?)! 110 let myLongitude : CLLocationDegrees = (long as CLLocationDegrees?)! 111 112 let myPin = MKPointAnnotation() 113 114 // 座標を設定. 115 let myCoordinate: CLLocationCoordinate2D = CLLocationCoordinate2DMake(myLatitude, myLongitude) 116 myPin.coordinate = myCoordinate 117 118 // タイトルを設定. 119 myPin.title = name 120 121 // サブタイトルを設定. 122 myPin.subtitle = address 123 124 // MapViewにピンを追加 125 self.myMapView.addAnnotation(myPin) //ここでエラー発生 126 } 127 128 override func didReceiveMemoryWarning() { 129 super.didReceiveMemoryWarning() 130 // Dispose of any resources that can be recreated. 131 } 132} 133

swift

1 2// SubTableViewCountroller.swift 3 4import UIKit 5import MapKit 6 7class SubTableVC_1: UIViewController, UITableViewDelegate, UITableViewDataSource, MKMapViewDelegate { 8 9 // ステータスバーの高さ 10 let statusBarHeight = UIApplication.shared.statusBarFrame.height 11 12 var senderRegion : String! 13 14 var filename : Int! 15 var filenameStr : String! 16 17 let array1 = ["北海道"] 18 19 var arrays = [""] 20 21 var exitBtn : UIButton! 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 26 let tableView = UITableView() 27 tableView.frame = CGRect(x: 0, y: statusBarHeight, width: self.view.frame.width, height: self.view.frame.height - statusBarHeight - 50) 28 29 tableView.delegate = self 30 tableView.dataSource = self 31 32 self.view.addSubview(tableView) 33 34 arrays = array1 35 filename = 000 36 37 } 38 39 override func didReceiveMemoryWarning() { 40 super.didReceiveMemoryWarning() 41 42 } 43 44 45 // MARK: - UITableViewDataSource 46 47 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 48 // セルを作る 49 let cell = UITableViewCell(style: .default, reuseIdentifier: "cell") 50 cell.textLabel?.text = arrays[indexPath.row] 51 return cell 52 } 53 54 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 55 // セルの数を設定 56 return arrays.count 57 } 58 59 // MARK: - UITableViewDelegate 60 61 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 62 // セルがタップされた時の処理 63 csvToArray(index: indexPath.row) 64 } 65 66 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 67 // セルの高さを設定 68 return 50 69 } 70 71 func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) { 72 // アクセサリボタン(セルの右にあるボタン)がタップされた時の処理 73 print("タップされたアクセサリがあるセルのindex番号: \(indexPath.row)") 74 } 75 76 var csvArr : [String] = [] 77 78 func csvToArray (index: Int) { 79 filenameStr = "assets/sh/" + (String(format: "%03d", filename + index)) 80 print(filenameStr) 81 if let csvPath = Bundle.main.path(forResource: filenameStr, ofType: "csv") { 82 do { 83 let csvStr = try String(contentsOfFile:csvPath, encoding:String.Encoding.utf8) 84 let csvChg = csvStr.replacingOccurrences(of: "\r", with: "\n") 85 csvArr = csvChg.components(separatedBy: .newlines) 86 87 var csvShrine : [String] = [] 88 var shrineName : String! 89 var shrineAddress : String! 90 var shrineLatitude : String! 91 var shrineLongitude : String! 92 93 for i in 0...(csvArr.count - 1) { 94 csvShrine = csvArr[i].components(separatedBy: ",") 95 96 if (csvShrine[0] != ""){ 97 98 shrineName = csvShrine[2] 99 shrineAddress = csvShrine[1] 100 shrineLatitude = csvShrine[3] 101 shrineLongitude = csvShrine[4] 102 103 print(("\(i / 2 + 1)") + ":" + (shrineName) + ":" + (shrineAddress) + ":" + (shrineLatitude) + ":" + (shrineLongitude)) 104 105 ViewController().pin(name: shrineName, address: shrineAddress, lati: atof(shrineLatitude), long: atof(shrineLongitude)) 106 } 107 } 108 } catch let error as NSError { 109 print(error.localizedDescription) 110 } 111 } 112 self.performSegue(withIdentifier: "fromSubTableVC_1Segue", sender: nil) 113 } 114}

assets/sh/000.csv このデータに神社名と緯度・軽度が示されている

1,北海道野付郡別海町別海宮舞町23,別海神社社務所,43.395813,145.124554 2,北海道小樽市塩谷2丁目20-20,塩谷神社社務所,43.207892,140.924224 3,北海道岩見沢市2条東4丁目1-3,御嶽神社,43.206618,141.768348 4,北海道札幌市中央区南15条西5丁目1-1,札幌護国神社,43.040716,141.352921 5,北海道札幌市厚別区大谷地西二丁目2番1号,大谷地神社,43.026356,141.447487 6,北海道虻田郡洞爺湖町青葉町54番,虻田神社社務所,42.55366,140.762298 7,北海道檜山郡江差町字姥神町99-1,姥神大神宮,41.866344,140.12503 8,北海道檜山郡江差町字柏町216番,柏森神社,41.84801,140.126248 9,北海道函館市新八幡町30番,椴法華八幡神社,41.830463,141.14611 10,北海道稚内市大字宗谷村字宗谷99番の2,嚴島神社,45.485779,141.8836977

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

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

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

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

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

guest

回答2

0

自己解決

swift

1csvToArray(index: indexPath.row) 2self.dismiss(animated: true, completion: nil)

でマップにピンが刺さった状態で、ViewControllerに戻れました。

投稿2017/07/24 00:31

harima

総合スコア17

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

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

0

swift

1ViewController().pin(...)

これでは、遷移元のViewControllerのpin()を呼んでいるのではなく、新たに生成したViewControllerのpin()を呼んでいることになります。

また、今回のエラーとは関係ありませんが、viewWillAppear(_:)でmapViewを生成しているので、SubTableVC_1でいくらピンを立てても、戻った時にはmapViewは初期化されてしまいますよ。

投稿2017/07/20 03:01

fuzzball

総合スコア16731

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

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

harima

2017/07/20 03:41

おっしゃていることは、理解しました。ですが、pin(...)をどのように呼んだらいいのか、さっぱり分かりません。すみませんが、どのようにして、呼んだらいいのでしょうか?宜しくお願い致します。
fuzzball

2017/07/20 04:15

delegateという言葉を調べれば何か分かるかも知れませんし、delegateでなくても、とにかくViewControllerのインスタンスを渡してやればいいです。 ちなみにナビゲーションコントローラは使っていないのでしょうか? 遷移の種類はShow?Modally?
harima

2017/07/20 04:19

ナビゲーションコントローラーは使っておりません。 遷移の種類は、showです。
fuzzball

2017/07/20 04:28

今回のケースでは、self.presentingViewController で遷移元のViewControllerを取得できると思います。
harima

2017/07/20 05:12

self.presentingViewController.pin(....)でよろしいのですか?エラーになりました。
fuzzball

2017/07/20 05:28

そのままではUIViewControllerと認識してしまうので、ViewControllerにキャストして下さい。
harima

2017/07/20 05:43

(self.presentingViewController as! ViewController).pin(...)としました。エラーは出なかったのですが、ピンが立っていませんでした。viewWillAppear(_:)も削除しています。
fuzzball

2017/07/20 05:56

SubTableVC_1に遷移せずに、まずはViewControllerの中でピンを立ててみて、ピンを立てるコードが間違っていないかどうか確認して下さい。修正したのであれば、質問内のコードも更新しておいて下さい。 あと、自分で何も調べずに質問を繰り返すことはやめましょうね。
harima

2017/07/20 06:01

ViewControllerの中ではピンは立っています。毎度毎度すみません。自分で調べることもこれからはします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問