xcode 如何将开关数据作为应用程序委托中的数组发送

qvtsj1bj  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(101)

我有一个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应用程序,所以有没有人能帮我

nkkqxpd9

nkkqxpd91#

1.如何使用数组收集交换机数据

为了公平起见,我建议使用字典而不是数组。下面是我的建议:

  • 仅写入一个方法@IBAction func switchChanged(_ sender: UISwitch)
  • 在情节提要中,将所有开关操作绑定到switchChanged方法
  • 同样在你的故事板中,使每个开关都是唯一的。你可以使用许多UISwitch属性来实现这一点,其中包括:
  • 恢复标识符
  • 可访问性标识符
  • 标签x1c 0d1x

在本例中,我将使用accessibilityIdentifier,但要选择最适合您的用例的标识符。
接下来,在ViewController中声明一个字典来保存所有开关的状态,并在switchChanged方法中更新它,sender参数将告诉我们用户更改了哪个开关。

class ViewController: UIViewController {
    private var switchStates: [String: Bool] = [:]

    @IBAction func switchChanged(_ sender: UISwitch) {
        guard let identifier = sender.accessibilityIdentifier else {
            return
        }
        switchStates[identifier] = sender.isOn
    }
}

2.不使用AppDelegate将数据传递给下一个ViewController

那么,只需在didTapButton中传递SwitchState集合即可。当然,您的SecondViewController为此需要一个switchStates属性。

@IBAction func didTapButton(){
    let vc = storyboard?.instantiateViewController(withIdentifier: "second") as! SecondViewController
    vc.modalPresentationStyle = .fullScreen
    vc.switchStates = switchStates
    present(vc,animated: true)
}

3.额外小费

使用Storyboard Segue,而不是手动示例化下一个ViewController并导航到它!在这种情况下,您可以将按钮I直接绑定到故事板中的segue,并将switchStates传递到func prepare(for segue: UIStoryboardSegue, sender: Any?)

相关问题