2017-03-24 10 views
1

私はそちらを見て、目標を達成する方法を見つけるために多くのブログを読んでいます。私が出会った最も分かりやすい投稿はここにあるものでしたPass data back to previous viewcontroller。私の理解が混ざっていると確信していますが、私が達成しようとしているのは、2番目のビューでセルをスワイプしたときに地図からアノテーションを削除することです。Swift 3プロトコルと委任方法?

注釈をCoreDataから削除することは問題ではないので、rightCallOutをクリックしたときにピンを削除することも問題ではありません。この問題は、VC2のアクションからVC1のマップから注釈を削除したいときに発生します。私はこの単純なプロセスを誤解していますが、どのように達成するのですか?

FirstViewController

import UIKit 

class ViewController: UIViewController, PinRemoverDelegate { 

    func removePin() { 
     mapView.removeAnnotation(selectedAnnotation) 
    } 

} 

SecondViewController

import UIKit 

protocol PinRemoverDelegate: class { 
    func removePin() 
    } 

class SecondViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    weak var delegate: PinRemoverDelegate? = nil 

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     if editingStyle == .delete { 
      let place = storedLocations[indexPath.row] 
      context.delete(place) 
      (UIApplication.shared.delegate as! AppDelegate).saveContext() 

    // Attempt To remove The Pin 
     delegate?.removePin() 
     } 

     tableView.reloadData() 
    } 

} 
+0

'SecondViewController'には、メッセージを送信するView Controllerインスタンスに設定された' weak var delegate:PinRemoverDelegate? 'プロパティが必要です。通常は、両方のView Controllerを所有しているか認識しているコードで、 'delegate'を割り当てます。 – par

+0

病気を編集する、私はすでに弱い変数を実装している、私はちょうどクイックコピー/短縮コードの貼り付けでそれを失った。 – Chilly

+0

あなたの 'FirstViewController'にデリゲートをselfとして設定することを忘れないでください。 'vc2.delegate = self'のようなものです。 'SecondViewController'をどのように表示するかによって異なります。 – xmhafiz

答えて

0

誤解がピンを削除する唯一の方法です。 removePin関数を呼び出すのが間違っています。ピンがCoreDataからすでに削除されているため、CoreDataをリロードするだけです。