如何将弹窗表单信息添加至UITableView?(Xcode+Swift4)
嘿,我来帮你捋清楚这个需求的实现思路!用Swift4在Xcode里实现这个功能其实并不复杂,咱们一步步拆解来做:
实现步骤详解
1. 先把数据结构化:定义模型
首先得把你要存储的专辑信息规整成一个数据模型,这样后续处理起来更清晰。创建一个Album结构体,包含你需要的所有字段:
struct Album { let artist: String // 艺术家名字(作为表头) let albumName: String // 专辑名称 let price: String // 专辑价格 // 要是还有其他字段比如发行日期,直接在这里加就行 }
然后在你的ViewController里维护两个数据源:一个用来存所有专辑,另一个用来按艺术家分组(方便后续给TableView提供分组数据):
var allAlbums: [Album] = [] var groupedAlbums: [String: [Album]] = [:]
2. 把TableView设置成分组样式
因为你需要每个艺术家作为一个分组的表头,所以必须把UITableView的样式改成Grouped。两种方式设置:
- Storyboard可视化设置:选中TableView,在右侧Attributes Inspector里找到「Style」,选择「Grouped」。
- 代码初始化设置:如果是纯代码创建TableView,初始化时指定样式:
let tableView = UITableView(frame: view.bounds, style: .grouped)
3. 处理弹窗的保存逻辑
当用户在弹窗里填完信息点击「保存」时,咱们要做这几件事:获取输入内容、创建专辑实例、更新数据源、刷新TableView,最后关闭弹窗。示例代码如下:
// 假设弹窗里的输入框分别是artistTF、albumTF、priceTF @IBAction func saveBtnTapped(_ sender: UIButton) { // 先校验输入不能为空 guard let artist = artistTF.text?.trimmingCharacters(in: .whitespaces), !artist.isEmpty, let albumName = albumTF.text?.trimmingCharacters(in: .whitespaces), !albumName.isEmpty, let price = priceTF.text?.trimmingCharacters(in: .whitespaces), !price.isEmpty else { // 这里可以加个提示,比如弹个alert告诉用户必填项不能为空 return } // 创建新的专辑实例 let newAlbum = Album(artist: artist, albumName: albumName, price: price) allAlbums.append(newAlbum) // 更新分组数据源 if var artistAlbumList = groupedAlbums[artist] { // 该艺术家已有专辑,直接追加 artistAlbumList.append(newAlbum) groupedAlbums[artist] = artistAlbumList } else { // 该艺术家是首次添加,新建数组存入 groupedAlbums[artist] = [newAlbum] } // 刷新TableView,让新数据显示出来 tableView.reloadData() // 关闭弹窗 dismiss(animated: true) }
4. 实现TableView的数据源方法
这一步是核心,要告诉TableView有多少个分组、每个分组有多少行、表头显示什么、每个单元格显示什么内容。示例代码如下:
// 分组数量 = 分组字典里的艺术家数量 override func numberOfSections(in tableView: UITableView) -> Int { return groupedAlbums.keys.count } // 每个分组的行数 = 对应艺术家的专辑数量 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 先拿到当前分组对应的艺术家名字,这里做了排序让分组更整齐 let sortedArtists = groupedAlbums.keys.sorted() let currentArtist = sortedArtists[section] return groupedAlbums[currentArtist]?.count ?? 0 } // 设置分组的表头标题(就是艺术家名字) override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { let sortedArtists = groupedAlbums.keys.sorted() return sortedArtists[section] } // 配置每个单元格的内容 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // 这里假设你给cell的identifier是"AlbumCell",记得提前注册哦 let cell = tableView.dequeueReusableCell(withIdentifier: "AlbumCell", for: indexPath) let sortedArtists = groupedAlbums.keys.sorted() let currentArtist = sortedArtists[indexPath.section] let currentAlbum = groupedAlbums[currentArtist]![indexPath.row] // 给cell赋值,这里用系统默认的textLabel和detailTextLabel做示例 cell.textLabel?.text = currentAlbum.albumName cell.detailTextLabel?.text = "¥\(currentAlbum.price)" return cell }
几个小提示
- 别忘了注册Cell:如果是纯代码创建的TableView,要提前注册Cell:
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "AlbumCell")
要是用Storyboard拖的Cell,直接在Storyboard里给Cell设置好Identifier就行。
- 自定义表头样式:如果系统默认的表头样式不够好看,你可以实现
tableView(_:viewForHeaderInSection:)方法来创建自定义的表头视图,比如加个背景色、调整字体大小之类的。 - 排序可按需调整:上面的代码里给艺术家名字做了排序,要是你不需要排序,直接用
Array(groupedAlbums.keys)[section]获取当前分组的艺术家就行。
内容的提问来源于stack exchange,提问作者MoonMan
相关产品推荐
相关产品推荐

