I've got this app in which I need to pass an address displayed on a textLabel ( I am adding an invisible button over the textLabel.
So by tapping on the button, I pretend to pass the text from that View to another view which is a MapViewController to display that text and get directions using the Maps App from the iPhone.
I am trying to do this through performing a segue like this:
This inside my MainViewController :
#IBAction func goToMap(_ sender: Any? ) {
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
if segue.destination is MapViewController
{
let vc = segue.destination as? MapViewController
vc?.pinAddress = addressLabel.text!
}
}
}``
// pinAddress is declared inside the MapViewController and I need the text in the addressLabel that is actually in MainViewController.This is not working though...
You need to get prepare(for segue out of the IBAaction
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let vc = segue.destination as! MapViewController
vc.pinAddress = addressLabel.text!
}
#IBAction func goToMap(_ sender: Any? ) {
self.performSegue(withIdentifier:"segue",sender:nil)
}
Related
So I'm learning Core Data and I managed to create a segue with a parent relationship that allows me to segue to show only certain items based on the category you select in the previous VC (A Category View Controller). Now I have created a separate VC after this which shows the weather based on your location and to get to it you have to click the button from the original VC (The Category View Controller) to get to the weatherViewController. However every time I try to do so and perform a segue I run into this error below :
This is the code I have so far :
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destinationVC = segue.destination as! NoteTableViewController
let weatherDestinationVC = segue.destination as! WeatherViewController
if let indexLocale = noteTableView.indexPathForSelectedRow {
destinationVC.selectionCategory = noteArray[indexLocale.row]
print(indexLocale.row)
} else {
print("Error")
weatherDestinationVC.delegate = self
performSegue(withIdentifier: "goToWeather", sender: self)
}
}
#IBAction func goToWeatherView(_ sender: UIBarButtonItem) {
performSegue(withIdentifier: "goToWeather", sender: self)
}
Any help would be appreciated since I am just learning Core Data!
Conditionally cast the different segue destination view controllers or check for the segue's identifier whichever you prefer.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationVC = segue.destination as? NoteTableViewController {
if let indexLocale = noteTableView.indexPathForSelectedRow {
destinationVC.selectionCategory = noteArray[indexLocale.row]
print(indexLocale.row)
}
} else if let weatherDestinationVC = segue.destination as? WeatherViewController {
weatherDestinationVC.delegate = self
}
}
Also, you don't have to performSegue within prepareForSegue.
Im fairly new to Xcode and seems to be having a bit of a problem. I was passing data from my tableviewcontroller to EventViewController and it worked fine with the code bellow:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? EventViewController {
destination.Event = events[(tableView.indexPathForSelectedRow?.row)!]
}
}
But I needed to make some changes to the app and Embedded a tab bar controller to the EventViewController, and now I can't get it to run. How do I pass data to the First tab in the Tabbarcontroller instead? :) Thank you very much for your help.
Try this
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = (segue.destination as? UITabBarController)?.viewControllers.first as? EventViewController {
destination.event = events[(tableView.indexPathForSelectedRow?.row)!]
}
}
I am trying to pass a users id to a container view by preparing for a segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "childSegue" {
if let destinationVC = self.childViewControllers.first as? InterestCollectionController {
destinationVC.currentUser = self.currentUser
}
}
}
however, this is not working. I have my storyboard that looks like this.
storyboard I have also tried using segue.destination as! InterestCollectionController and that did not work either. From my understanding this is the way I should be passing data to my container view. Any help is appreciated thanks!
Just try this without using if statement:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "childSegue" {
let destinationVC = segue.destinationViewController as InterestCollectionController
destinationVC.currentUser = self.currentUser
}
}
1. Make sure your segue identifier matches with storyboard identifier.
2. Also verify once you have given exact segue to the above mentioned controller in storyboard.
Try this one
var destinationVC : InterestCollectionController?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "childSegue") {
self.destinationVC = segue.destination as? InterestCollectionController
destinationVC.currentUser = self.currentUser
}
}
I tested that the view of the embedded view controller is not loaded, in other words, the viewDidLoad() was not invoked, before the containerVC's prepare() was called.
Therefore, you cannot directly pass data to the destination view controller inside the prepare() function.
I am preparing the values from func prepare. The problem is the application crashes because the destination returns SWRevealViewController instead of UIViewController. I am using SWRevealViewController on the storyboard.
override func prepare(for segue: UIStoryboardSegue, sender: Any?){
if (segue.identifier == "Main") {
let view = (segue.destination as! Main)
view.expired_login = self.expired_login
}
}
It crashes on the let view line. Here is the message
Could not cast value of type 'SWRevealViewController' (0x10afa72a8) to 'JetWayTrade.Main' (0x10afac038).
Is there a way to get the Main so that I can set its properties? Here is the storyboard image
If I understand you correctly you will want to cast the destination view controller as SWRevealViewController:
override func prepare(for segue: UIStoryboardSegue, sender: Any?){
if (segue.identifier == "Main") {
let view = (segue.destination as! SWRevealViewController)
view.expired_login = self.expired_login
}
}
If you are expecting your Main view controller to be the destination then you will have to check that your segue names are set correctly in your storyboard.
Right now I am facing some problem to pass data from UIViewController to UISpiltViewController.
My app start with UIViewController, and after user login it, there is a segue from UIViewController to UISpiltViewController, UISpiltViewController is root view of a NavigationViewController, and this NavigationViewController is a root view of a TableViewController. I have written a class for this TableViewController, called MasterView, and right now I want to pass some information from loginView to this MasterView.
self.performSegueWithIdentifier("login", sender: self)
But I want to know how to write the prepareforsegue function.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "login"
{
let controller = (segue.destinationViewController as UINavigationController).topViewController as MasterViewController
controller.authorityNum = self.authorityArray
}
}
I want to pass an array, but I will get class cast error. Please help me with this.
Try this i am not sure but i think your segue is Model segue so
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "login"
{
var splitView:UISplitViewController = segue.destinationViewController as! UISplitViewController
var controller = splitView.viewControllers.first?.topViewController as! MasterViewController
controller.authorityNum = self.authorityArray
}
}
Try to NSLog every line it may help
Like this,
let destinationViewController = segue.destinationViewController as! MasterViewController
Swift 3 of the accepted answer.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "login" {
let splitView:UISplitViewController = segue.destination as! UISplitViewController
let navController = splitView.viewControllers.first as! UINavigationController
let controller = navController?.topViewController as! MasterViewController
controller.authorityNum = self.authorityArray
}
}