What I’ve done so far is working but I would like to know whether this is the proper way or not.
I have a map that shows an annotation when this is pressed shows a callout.
The next view shown is a table view. This table has a button to remove that annotation.
I created one property in the table View of type MKMapView. After this view is initialized when the callOut accessory is tapped, I set the MKMapView property.
When the button is pressed in the table view, I delete the annotation through the map property.
Is this the right way?
Rather than the detail view directly manipulating the parent (map) controller view’s controls, a more “right” approach might be to use delegate+protocol.
Define a protocol with the methods that the map controller needs to implement (eg. deleteAnnotation, detailViewDone, etc).
The detail view will have a delegate property for that protocol and call the protocol methods via the delegate property instead of directly accessing and modifying another view’s controls.
The map controller would set itself as the delegate of the detail view and actually implement the protocol methods.
This way, each controller/class doesn’t have to know the internal details of how the others work and let’s you more easily change how each one works internally without affecting code in the others (as long as the protocol doesn’t change). It improves encapsulation and reusability.
For example, in the detail view .h, define the protocol and declare the delegate property:
In the detail view .m, wherever you handle the delete button, call the delegate method instead:
In the map controller .h, declare that it implements the protocol and declare the methods:
In the map controller .m, in calloutAccessoryControlTapped where you create the detail view, set the delegate property instead of the map view property:
Finally, also in the map controller .m, implement the delegate method:
From the documentation, the articles Delegates and Data Sources and Using Delegation to Communicate with Other Controllers may be useful as well.