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

Swift中如何在Today Extension中将数组转为表格?

解决Today Extension读取并展示主App数组数据的问题

嘿,作为Swift新手碰到跨组件数据共享的问题太正常了,我来帮你一步步搞定把数组从主App传到Today Extension并显示在表格里的需求~

第一步:正确在主App中存储数组到共享UserDefaults

UserDefaults支持直接存储符合PropertyListSerializable的数组类型(比如[String]、[Int]这类基础类型数组),先修改主App的代码:

// MainVC.swift
if let userDefaults = UserDefaults(suiteName: "group.Name1") {
    // 替换成你实际要共享的数组
    let sharedArray = ["早餐", "午餐", "晚餐", "加餐"]
    userDefaults.set(sharedArray, forKey: "sharedDataArray")
    // 注:iOS 13+ 不需要调用synchronize(),系统会自动同步;旧版本可以保留
    // userDefaults.synchronize()
}

如果你的数组是自定义对象,需要先将对象序列化为Data再存储(记得让自定义模型遵守Codable协议):

// 自定义模型示例
struct CustomItem: Codable {
    var title: String
    var detail: String
}

// 主App中存储自定义对象数组
if let userDefaults = UserDefaults(suiteName: "group.Name1") {
    let customItems = [CustomItem(title: "苹果", detail: "新鲜红苹果"), CustomItem(title: "香蕉", detail: "软糯香甜")]
    if let encodedData = try? JSONEncoder().encode(customItems) {
        userDefaults.set(encodedData, forKey: "customSharedArray")
    }
}

第二步:在Today Extension中读取数组

在TodayExtVC里先声明一个数据源数组,然后从共享UserDefaults读取数据,之后刷新表格:

// TodayExtVC.swift
import UIKit

class TodayExtVC: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    // 连接Storyboard中的表格
    @IBOutlet weak var todayTableView: UITableView!
    // 表格数据源数组,根据你的数据类型调整
    var displayData: [String] = []
    // 如果是自定义对象数组,就改成:var displayData: [CustomItem] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
        loadSharedData()
    }
    
    private func setupTableView() {
        // 设置表格的数据源和代理
        todayTableView.dataSource = self
        todayTableView.delegate = self
        // 如果用自定义Cell,记得注册Cell
        // todayTableView.register(UITableViewCell.self, forCellReuseIdentifier: "TodayCell")
    }
    
    private func loadSharedData() {
        guard let userDefaults = UserDefaults(suiteName: "group.Name1") else { return }
        
        // 读取基础类型数组
        if let sharedArray = userDefaults.array(forKey: "sharedDataArray") as? [String] {
            displayData = sharedArray
        }
        
        // 如果是读取自定义对象数组,用这段代码替换上面的读取逻辑
        /*
        if let encodedData = userDefaults.data(forKey: "customSharedArray"),
           let customArray = try? JSONDecoder().decode([CustomItem].self, from: encodedData) {
            displayData = customArray
        }
        */
        
        // 读取数据后刷新表格
        todayTableView.reloadData()
    }
    
    // MARK: - UITableView DataSource
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return displayData.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 替换成你实际的Cell标识符
        let cell = tableView.dequeueReusableCell(withIdentifier: "TodayCell", for: indexPath)
        
        // 基础类型数组的Cell配置
        cell.textLabel?.text = displayData[indexPath.row]
        
        // 自定义对象数组的Cell配置(示例)
        /*
        let item = displayData[indexPath.row]
        cell.textLabel?.text = item.title
        cell.detailTextLabel?.text = item.detail
        */
        
        return cell
    }
}

关键注意事项

  • 确认App Group配置正确:主App和Today Extension必须开启同一个App Group(也就是你用的group.Name1)。在Xcode中分别选中主App和Extension的Target,进入Signing & Capabilities,添加App Groups并勾选对应的group。
  • Cell标识符要匹配:在Storyboard/XIB中给表格Cell设置的Identifier,必须和代码里dequeueReusableCell用的标识符一致。
  • 处理空数据情况:用可选绑定来处理读取失败的情况,避免数组为nil导致表格崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:37:10