I have a table view and an array of strings. When I swipe a row, I want to add the clicked string to an array of strings. How do I get the value stored in the table view row. I have it set up like this:import UIKit
var myStringArray: [String]?
var someStringArray: [String] = ["Hot Dogs", "Soda", "Chips", "Hamburgers", "Plates", "Dessert", "Napkins", "Fruit",
"Potatoe Salad", "Brats"]
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return someStringArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath as IndexPath)
cell.textLabel?.text = someStringArray[indexPath.row]
cell.textLabel?.adjustsFontSizeToFitWidth = true
cell.textLabel?.font = UIFont.systemFont(ofSize: 22)
return cell
}
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let object: String = someStringArray[indexPath.row]
let add = UIContextualAction(style: .normal, title: "Add") { (contextualAction, view, actionPerformed: @escaping (Bool) -> Void) in
let alert = UIAlertController(title: "Add ", message: "Are you sure you want to add '\(object)' to your list?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "No", style: .cancel, handler: { (alertAction) in
actionPerformed(false)
}))
alert.addAction(UIAlertAction(title: "Yes", style: .destructive, handler: { (alertAction) in
self.addObject()
}))
self.present(alert, animated: true)
}
return UISwipeActionsConfiguration(actions: [add, taken])
}
func addObject(index: Int) {
let index = table.indexPathForSelectedRow
let _index = (index?[someStringArray.hashValue])!
if myStringArray!.isEmpty {
myStringArray?.insert(someStringArray[_index], at: 0)
} else {
myStringArray?.append(someStringArray[_index])
}
}
Post
Replies
Boosts
Views
Activity
I have a function that generates the random color. Every time I call the function, it generates the same color. I put the function in viewDidLoad() but it still generates the same color.
Xcode, Swift 4How do I pass data to another view controller in Swift 4?Below is my code and I am getting an error message.I am getting an error on line 181. It saysCannot assign value of type 'DataToPass' to type 'ViewController'struct DataToPass {
var principal: Double = 0
var balance: Double = 0
var monthlyInterest: Double = 0
var paymentNumber: Int = 0
}
class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {
var valueToPass: DataToPass = DataToPass(principal: 0.00, balance: 0.00, monthlyInterest: 0.00, paymentNumber: 0)
// Class-level constant to hold the months per year.
let dblMONTHS_YEAR: Double = 12
// To not allow more than 1 decimal point.
func textField(_ textField: UITextField,shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool
{
let countdots = (textField.text?.components(separatedBy: ".").count)! - 1
if countdots > 0 && string == "."
{
return false
}
return true
}
@IBAction func textFieldCost(_ sender: TextField) {
func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
@IBAction func textFieldDownPayment(_ sender: TextField) {
func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
@IBAction func textFieldMonths(_ sender: TextField) {
func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
@IBAction func textFieldAPR(_ sender: TextField) {
func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
@IBOutlet weak var txtViewLabels: UITextView!
@IBOutlet weak var txtViewResults: UITextView!
// Text Field Outlets.
@IBOutlet weak var txtCost: UITextField!
@IBOutlet weak var txtDownPayment: UITextField!
@IBOutlet weak var txtMonths: UITextField!
@IBOutlet weak var txtAPR: UITextField!
// Error Message.
@IBOutlet weak var lblMessage: UILabel!
// Buttons
@IBAction func btnCalculate(_ sender: UIButton) {
var dblAPR: Double = 0 // To hold the Annual Rate.
var dblTotalAmount: Double = 0 // To hold the vehicle total cost.
var dblCost: Double = 0 // To hold vehicle cost.
var dblDownPayment: Double = 0 // To hold down payment.
var intMonths: Int = 0 // To hold number of months for the loan.
var dblLoan: Double = 0 // To hold the amount of the loan.
var dblMonthlyPayment: Double = 0 // To hold the monthly payment.
var dblTotalInterest: Double = 0 // To hold the total interest.
var dblMonthlyRate: Double = 0 // To hold the monthly Rate.
var monthlyInterest: Double = 0
var balance: Double = 0
var principal: Double = 0
var paymentNumber: Int = 0
var data: [String] = []
func passedValue() {
func paymentStructure() {
data = []
balance = dblLoan
for _ in 1...intMonths {
paymentNumber+=1
dblCost = Double(txtCost.text!)!
dblDownPayment = Double(txtDownPayment.text!)!
intMonths = Int(txtMonths.text!)!
dblAPR = Double(txtAPR.text!)!
monthlyInterest = balance * ((dblAPR/100)/12)
principal = dblMonthlyPayment - monthlyInterest
balance = balance - principal
let fPrincipal = NSNumber(value: principal)
let fResultPrincipal = NumberFormatter.localizedString(from: fPrincipal, number: .currency)
let fBalance = NSNumber(value: balance)
let fResultBalance = NumberFormatter.localizedString(from: fBalance, number: .currency)
let fMonthlyInterest = NSNumber(value: monthlyInterest)
let fResultMonthlyInterest = NumberFormatter.localizedString(from: fMonthlyInterest, number: .currency)
data += ["\(paymentNumber). P: \(fResultPrincipal), I: \(fResultMonthlyInterest), B: \(fResultBalance)"]
}
valueToPass.paymentNumber = intMonths
valueToPass.monthlyInterest = monthlyInterest
valueToPass.principal = principal
valueToPass.balance = balance
}
}
else if txtCost.text != nil && txtDownPayment.text != nil && txtMonths.text != nil && txtAPR.text != nil {
// Clear the message.
lblMessage.text = ""
dblCost = Double(txtCost.text!)!
dblDownPayment = Double(txtDownPayment.text!)!
intMonths = Int(txtMonths.text!)!
dblAPR = Double(txtAPR.text!)!
// Get the APR rate.
dblAPR = dblAPR / 100
// Get the monthly rate.
dblMonthlyRate = dblAPR / dblMONTHS_YEAR
// Get the monthly payment.
dblMonthlyPayment = (dblCost - dblDownPayment) * (dblMonthlyRate / (1 - pow(1 + dblMonthlyRate, Double(-intMonths))))
// Get the amount of the loan.
dblLoan = dblCost - dblDownPayment
// Get the total interest.
dblTotalInterest = dblMonthlyPayment * Double(intMonths) - dblLoan
// Get the Total Amount.
dblTotalAmount = dblCost + dblTotalInterest
// Get the Vehicle Cost.
dblCost = dblTotalAmount - dblTotalInterest
// Format the results.
let fCost = NSNumber(value: dblCost)
let fResultCost = NumberFormatter.localizedString(from: fCost, number: .currency)
let fDownPayment = NSNumber(value: dblDownPayment)
let fResultDownPayment = NumberFormatter.localizedString(from: fDownPayment, number: .currency)
let fLoan = NSNumber(value: dblLoan)
let fResultLoan = NumberFormatter.localizedString(from: fLoan, number: .currency)
let fMonthlyPayment = NSNumber(value: dblMonthlyPayment)
let fResultMonthkyPayment = NumberFormatter.localizedString(from: fMonthlyPayment, number: .currency)
let fAPR = NSNumber(value: dblAPR)
let fResultAPR = NumberFormatter.localizedString(from: fAPR, number: .percent)
let fTotalInterest = NSNumber(value: dblTotalInterest)
let fResultTotalInterest = NumberFormatter.localizedString(from: fTotalInterest, number: .currency)
let fTotalAmount = NSNumber(value: dblTotalAmount)
let fResultTotalAmount = NumberFormatter.localizedString(from: fTotalAmount, number: .currency)
txtViewLabels.text = " APR:\n Months: \n Cost:\n Down Payment:\n Loan Amount:\n Monthly Payment:\n Total Interest:\n Total Amo
txtViewResults.text = " \(fResultAPR)\n \(intMonths)\n \(fResultCost)\n \(fResultDownPayment)\n \(fResultLoan)\n \(fResultMonthkyPayment)\n \(fResultTotalInterest)\n \(fResultTotalAmount)"
passedValue()
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "payout structure" {
if let destVC = segue.destination as? PayoutStructure {
destVC.passedData = valueToPass
}
}
}
}