我有一个ios应用程序,在一个视图控制器中有多个开关,我需要把数据从这些开关发送到下一个视图控制器,它会把数据发送到数据库,我使用应用程序代理作为中间人。
为了解决这个问题,下面是我在视图控制器中使用的代码。
// ViewController.swift
// DepressionApp1
//
// Created by Ashok Nambisan on 10/30/22.
//
import UIKit
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var imageview: UIImageView!
var switche: Int = 0
var switche1: Int = 0
@IBOutlet weak var switchButton1: UISwitch!
@IBOutlet weak var switchButton: UISwitch!
override func viewDidLoad() {
super.viewDidLoad()
if let imageData = UserDefaults.standard.data(forKey: "imageData") {
let image = UIImage(data: imageData)
imageview.image = image
}
switchButton.isOn = false
let switchValue = UserDefaults.standard.integer(forKey: "switchValue")
switchButton.isOn = (switchValue == 1)
switchButton1.isOn = false
let switchValue1 = UserDefaults.standard.integer(forKey: "switchValue")
switchButton1.isOn = (switchValue1 == 1)
}
@IBAction func switchChanged1(_ sender: UISwitch) {
switche1 = sender.isOn ? 1 : 0
UserDefaults.standard.set(switche1, forKey: "switchValue1")
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.switche1 = switche1
}
@IBAction func switchChanged(_ sender: UISwitch) {
switche = sender.isOn ? 1 : 0
UserDefaults.standard.set(switche, forKey: "switchValue")
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.switche = switche
}
@IBAction func Btnimagepicker(_ sender: Any) {
let picker = UIImagePickerController()
picker.allowsEditing=true
picker.delegate=self
present(picker, animated:true)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let image=info[.editedImage] as? UIImage else {return}
imageview.image=image
let imageData = image.jpegData(compressionQuality: 0.5)
UserDefaults.standard.set(imageData, forKey: "imageData")
if let imageData = imageData {
let imageDataBase64String = imageData.base64EncodedString()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.myData = imageDataBase64String
}
dismiss(animated:true)
}
@IBAction func didTapButton(){
let vc = storyboard?.instantiateViewController(withIdentifier: "second") as! SecondViewController
vc.modalPresentationStyle = .fullScreen
present(vc,animated: true)
}
}
我基本上初始化交换机,然后使用函数将数据发送到数据库,然后将其添加到应用程序委托中。var switche: Any?
并使用此代码在第三个视图控制器中调用它。
`let switche = appDelegate.switche
然而,虽然这段代码适用于1或2个开关,但我需要在这个视图控制器中使用6个开关,在下一个视图控制器中使用27个开关。问题是我必须为每个新开关重复switchChanged函数。我想知道是否可以找到更好更高效的方法,也许可以将开关存储在应用程序委托中的数组中,而不是单个变量。或者也许有一种更简单的方法来完成这一切?这是我的第一个iOS应用程序,所以有没有人能帮我
1条答案
按热度按时间nkkqxpd91#
1.如何使用数组收集交换机数据
为了公平起见,我建议使用字典而不是数组。下面是我的建议:
@IBAction func switchChanged(_ sender: UISwitch)
switchChanged
方法在本例中,我将使用accessibilityIdentifier,但要选择最适合您的用例的标识符。
接下来,在ViewController中声明一个字典来保存所有开关的状态,并在
switchChanged
方法中更新它,sender
参数将告诉我们用户更改了哪个开关。2.不使用AppDelegate将数据传递给下一个ViewController
那么,只需在
didTapButton
中传递SwitchState集合即可。当然,您的SecondViewController
为此需要一个switchStates
属性。3.额外小费
使用Storyboard Segue,而不是手动示例化下一个ViewController并导航到它!在这种情况下,您可以将按钮I直接绑定到故事板中的segue,并将
switchStates
传递到func prepare(for segue: UIStoryboardSegue, sender: Any?)
中