You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS多ViewController间TextField同步及邮件列表展示技术问题咨询

我来帮你搞定这两个iOS开发的问题,结合你给出的视图控制器配置,直接上具体的实现方案:

针对你的iOS视图控制器配置的两个问题解答

问题1:让ViewController2的TextField自动填充ViewController3中保存的文本

因为你已经用UserDefaults在ViewController3中保存了设置文本,核心思路就是在ViewController2加载/显示时,从UserDefaults读取对应数据,批量赋值给18个TextField。

实现步骤:

  1. 统一存储Key规则:确保ViewController3保存时,每个TextField的文本都用固定格式的Key存入UserDefaults,比如"SettingTextField_\(index)"(index从0到17)。
  2. ViewController3的保存逻辑(补充完善):
    在保存按钮的点击事件里,循环遍历18个TextField,把每个的文本存入UserDefaults:
    @IBAction func saveButtonTapped(_ sender: UIButton) {
        // 替换成你实际的18个TextField数组
        let textFields = [textField0, textField1, ..., textField17]
        for (index, textField) in textFields.enumerated() {
            UserDefaults.standard.set(textField.text, forKey: "SettingTextField_\(index)")
        }
        UserDefaults.standard.synchronize() // iOS10+后自动同步,显式调用更稳妥
    }
    
  3. ViewController2的自动填充逻辑:
    在viewWillAppear(_:)方法中(确保每次回到这个页面都能获取最新设置),同样遍历18个TextField,从UserDefaults读取对应Key的值并赋值:
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // 替换成你实际的18个TextField数组
        let textFields = [textField0, textField1, ..., textField17]
        for (index, textField) in textFields.enumerated() {
            let savedText = UserDefaults.standard.string(forKey: "SettingTextField_\(index)")
            textField.text = savedText
        }
    }
    
    这样每次ViewController2显示时,都会自动同步ViewController3保存的最新文本。

问题2:将ViewController2选中的TextField内容以垂直列表形式展示在邮件正文

需要先收集ViewController2中被开关选中的TextField文本,传递给ViewController1,最后拼接成垂直列表格式的字符串用于邮件正文。

实现步骤:

  1. 在ViewController2中关联TextField和开关:
    先把每组TextField和对应的开关存进一个数组,方便后续遍历筛选:
    // 定义数组存储TextField和对应Switch,在viewDidLoad中初始化
    var textFieldSwitchPairs: [(textField: UITextField, toggle: UISwitch)] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 替换成你实际的18组TextField和Switch
        textFieldSwitchPairs = [
            (textField0, switch0),
            (textField1, switch1),
            ...,
            (textField17, switch17)
        ]
    }
    
  2. 通过Segue传递选中的文本数组:
    在ViewController2的prepare(for:sender:)方法中,筛选出开关为打开状态的TextField文本,传递给ViewController1:
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // 替换成你实际返回ViewController1的segue标识符
        if segue.identifier == "BackToMainVC" {
            guard let destinationVC = segue.destination as? ViewController1 else { return }
            // 筛选选中的非空文本
            let selectedTexts = textFieldSwitchPairs
                .filter { $0.toggle.isOn && !($0.textField.text?.isEmpty ?? true) }
                .map { $0.textField.text! }
            destinationVC.selectedContent = selectedTexts
        }
    }
    
  3. 在ViewController1中处理邮件正文:
    先在ViewController1中定义接收选中内容的属性,再在邮件触发逻辑中拼接成垂直列表:
    // 接收从ViewController2传递来的选中内容
    var selectedContent: [String] = []
    
    @IBAction func sendEmailButtonTapped(_ sender: UIButton) {
        // 拼接成带项目符号的垂直列表
        let emailBody = selectedContent.map { "- \($0)" }.joined(separator: "\n")
        
        // 执行邮件发送逻辑(示例用MFMailComposeViewController)
        if MFMailComposeViewController.canSendMail() {
            let mailVC = MFMailComposeViewController()
            mailVC.setMessageBody(emailBody, isHTML: false)
            // 设置收件人、主题等其他属性
            present(mailVC, animated: true)
        }
    }
    
    这样邮件正文就会以清晰的垂直列表形式展示选中的内容。

内容的提问来源于stack exchange,提问作者EzeBuilt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:45:19