How to pass data from textfield to another textfiled? - ios

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
var secondController = segue.destination as! EditBillsViewController
secondController.textField = items
secondController.notesTextBox = notes
secondController.billNameTextBox = billsName
secondController.dateToPayTextBox = DatePickerText
secondController.DailyReminerTextBox = DaysNotification

First you get the Text from your textfield and then set it to the text of your second textfield.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let text = self.firstTextField.text else {
print("something Went wrong")
return
}
var secondController = segue.destination as! EditBillsViewController
secondController.textFieldValue = text
secondController.notesTextBox = notes
secondController.billNameTextBox = billsName
secondController.dateToPayTextBox = DatePickerText
secondController.DailyReminerTextBox = DaysNotification
}

Related

VC presenter is not being initialized prepare for segue IOS swift

Hello i am facing the problem as the prepare for segue function is not working properly i've the code can you please tell me how can i debug it as it has optional conditions how i can remove them and check what's the problem or what i am doing wrong as i just want a class to be initialized in target vc before the app navigates to other screen.
#IBAction func filterBtnPressed(_ sender: Any) {
self.performSegue(withIdentifier: "FilterSessionVC", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "FilterSessionVC", let navigation = segue.destination as? UINavigationController, let vc = navigation.topViewController as? FilterSessionVC {
vc.presenter = FilterSessionPresenterImplementation()
}
}
Basic debugging...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let identifier = segue.identifier
print("identifier:", identifier)
let dest = segue.destination
print("destination:", dest)
if let navigation = dest as? UINavigationController {
print("dest IS a UINavigationController")
if let vc = navigation.topViewController as? FilterSessionVC {
print("Top Controller IS a FilterSessionVC")
// here you can proceed
vc.presenter = FilterSessionPresenterImplementation()
} else {
print("Top Controller IS NOT a FilterSessionVC")
}
} else {
print("dest IS NOT a UINavigationController")
}
}
Set a breakpoint on the first line, then step through and inspect the results.

How to create sender.tag UIButton in another function?

I have an array of answers and an array of buttons. When I click on a particular button, with the help of a sender.tag, I have an index change. I also need to do in override func prepare(for segue: UIStoryboardSegue, sender: Any?) so that the answer is set by the index and the result will go to another screen.
When i tried to create sender.tag i have error
Value of type 'Any?' has no member 'tag'
#IBAction func answerPressed(_ sender: UIButton) {
let index = sender.tag
let currentAnswer = currentQuestions?.answers[index]
if currentAnswer!.type != .next {
performSegue(withIdentifier: "segue", sender: sender)
} else {
currentQuestions = currentAnswer!.nextQuestion
updateTittles(currentQuestions)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let index = sender.tag
let currentType = currentQuestions?.answers[index].type
let resultViewController = segue.destination as! ResultViewController
resultViewController.type = currentType
}
The sender in this case for the prepare for segue function is not necessarily a UIButton, it's whatever initiated the segue. You could check to see if it's a button by trying to cast it to one as follows:
if let button = sender as? UIButton {
index = button.tag
}
What you could also do is in the answerPressed function instead of performing a segue you could instantiate the ResultViewController yourself there and then push to it. Because when you're in this function you know that the sender is a UIButton and it should have a tag.
As Anything can be the type of sender the parameter is declared as Any
First check for the identifier of the segue, on success force downcast the sender parameter to UIButton
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == "segue" else { return }
let button = sender as! UIButton
let currentType = currentQuestions?.answers[button.tag].type
let resultViewController = segue.destination as! ResultViewController
resultViewController.type = currentType
}
But it's not necessary to pass the entire UIButton instance, the tag/index is sufficient, or – even more efficient – pass currentAnswer.type
#IBAction func answerPressed(_ sender: UIButton) {
let index = sender.tag
let currentAnswer = currentQuestions?.answers[index]
if currentAnswer!.type != .next {
performSegue(withIdentifier: "segue", sender: index)
} else {
currentQuestions = currentAnswer!.nextQuestion
updateTittles(currentQuestions)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == "segue" else { return }
let index = sender as! Int
let currentType = currentQuestions?.answers[index].type
let resultViewController = segue.destination as! ResultViewController
resultViewController.type = currentType
}
Value of type 'Any?' has no member 'tag'
Means that Any object has no indeed a tag property. You know your sender is a UIButton, so why not CAST that sender of prepareForSegue to a UIButton object, like so?
guard let buttonSender = sender as? UIButton else { return }

Pass a variable between controllers - Swift4

I'm trying to pass 1 variable to another view controller and then another view controller.
var selectedPlace = Place {
name = Daniel Webster Highway;
country = United States;
lat = 42.72073329999999;
lon = -71.44301460000001;
}
When I select on a cell, I have access to a variable selectedPlace
I want to pass it on to my PlaceDetailVC and also MapVC.
For some reasons, I can't make that happen.
PlacesVC
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destinationVC = segue.destination as! PlaceDetailVC
if let indexPath = tableView.indexPathForSelectedRow {
destinationVC.selectedPlace = (places?[indexPath.row])!
destinationVC.selectedTrip = selectedTrip!
}
}
PlaceDetailVC
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toMap" {
let destinationVC = segue.destination as! MapVC
if let indexPath = placesTable.indexPathForSelectedRow {
destinationVC.selectedPlace = selectedPlace
}
}
}
I also try
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destinationVC = segue.destination as! MapVC
if let indexPath = placesTable.indexPathForSelectedRow {
destinationVC.selectedPlace = selectedPlace
}
}
MapVC
print(selectedPlace,"<<<<<<")
Result
I kept getting
Any hints on what I did wrong ?
No need to check indexPath if the segue "toMap" is called by the nav button
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toMap" {
let destinationVC = segue.destination as! MapVC
destinationVC.selectedPlace = selectedPlace
/*
if let indexPath = placesTable.indexPathForSelectedRow {
destinationVC.selectedPlace = selectedPlace
}*/
}
}

Finishing this snippet of code to pass data via a segue from one controller to another

I have a ViewController, "ViewController".
Within this view there is an attribute 'userEmailText.text' that I want to pass along to another view controller, "CreateNewCommunity"
I have a button connected to a segue with identifier 'createCommunitySegue'. I have create the code for when this is tapped:
#IBAction func createCommunityTapped(_ sender: AnyObject) {
self.performSegue(withIdentifier: "createCommunitySegue", sender: self)
}
In my second view controller, "CreateNewCommunity" I have a variable:
var myEmail: String?
and I have started to build the code ready to receive the data from the segue:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "createCommunitySegue" {
let createCommunityController: CreateNewCommunity = segue.destination as! CreateNewCommunity
createCommunityController.myEmail =
}
}
How do I finish this set-up so that the initial 'userEmailText.text' value is passed by "ViewController" through segue 'createCommunitySegue' into "CreateNewCommunity" view controller?
Thanks
Why not just
createCommunityController.myEmail = userEmailText.text
I think your problem is that you have a wrong idea of how to pass data from one vc to another.
The VC that you are passing data to doesn't recieve the data. It is the VC that has the data proactively pass the data to the VC that needs it.
My guess would be that you put this code
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "createCommunitySegue" {
let createCommunityController: CreateNewCommunity = segue.destination as! CreateNewCommunity
createCommunityController.myEmail =
}
}
in the CreateNewCommunity controller! You should instead put the above in ViewController not CreateNewCommunity , and write
createCommunityController.myEmail = userEmailText.text
it should work.
VC1
#IBAction func createCommunityTapped(_ sender: AnyObject) {
self.performSegue(withIdentifier: "createCommunitySegue", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "createCommunitySegue" {
let createCommunityController: CreateNewCommunity = segue.destination as! CreateNewCommunity
createCommunityController.myEmail = userEmailText.text
}
}
VC2
var myEmail: String?
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print(myEmail)
}

Prepare for Segue in Swift

I'm facing the error message:
"UIStoryboardSegue does not have a member named 'identifier'"
Here's the code causing the error
if (segue.identifier == "Load View") {
// pass data to next view
}
On Obj-C it's fine using like this:
if ([segue.identifier isEqualToString:#"Load View"]) {
// pass data to next view
}
What am I doing wrong?
This seems to be due to a problem in the UITableViewController subclass template. It comes with a version of the prepareForSegue method that would require you to unwrap the segue.
Replace your current prepareForSegue function with:
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if (segue.identifier == "Load View") {
// pass data to next view
}
}
This version implicitly unwraps the parameters, so you should be fine.
Swift 4, Swift 3
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MySegueId" {
if let nextViewController = segue.destination as? NextViewController {
nextViewController.valueOfxyz = "XYZ" //Or pass any values
nextViewController.valueOf123 = 123
}
}
}
I think the problem is you have to use the ! to unbundle identifier
I have
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
if segue!.identifier == "Details" {
let viewController:ViewController = segue!.destinationViewController as ViewController
let indexPath = self.tableView.indexPathForSelectedRow()
viewController.pinCode = self.exams[indexPath.row]
}
}
My understanding is that without the ! you just get a true or false value
For Swift 2.3,swift3,and swift4:
Create a perform Segue at didSelectRowAtindexPath
For Ex:
self.performSegue(withIdentifier: "uiView", sender: self)
After that Create a prepareforSegue function to catch the Destination segue and pass the value:
Ex:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "uiView"{
let destView = segue.destination as! WebViewController
let indexpath = self.newsTableView.indexPathForSelectedRow
let indexurl = tableDatalist[(indexpath?.row)!].link
destView.UrlRec = indexurl
//let url =
}
}
You need to create a variable named UrlRec in Destination ViewController
Swift 1.2
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if (segue.identifier == "ShowDeal") {
if let viewController: DealLandingViewController = segue.destinationViewController as? DealLandingViewController {
viewController.dealEntry = deal
}
}
}
Prepare for Segue in Swift 4.2 and Swift 5.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "OrderVC") {
// pass data to next view
let viewController = segue.destination as? MyOrderDetailsVC
viewController!.OrderData = self.MyorderArray[selectedIndex]
}
}
How to Call segue On specific Event(Like Button Click etc):
performSegue(withIdentifier: "OrderVC", sender: self)
this is one of the ways you can use this function, it is when you want access a variable of another class and change the output based on that variable.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let something = segue.destination as! someViewController
something.aVariable = anotherVariable
}
Provided you aren't using the same destination view controller with different identifiers, the code can be more concise than the other solutions (and avoids the as! in some of the other answers):
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if let myViewController = segue.destinationController as? MyViewController {
// Set up the VC
}
}
Change the segue identifier in the right panel in the section with an id. icon to match the string you used in your conditional.
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
if(segue!.identifier){
var name = segue!.identifier;
if (name.compare("Load View") == 0){
}
}
}
You can't compare the the identifier with == you have to use the compare() method

Resources