ios - 如何添加动态部分但仍只添加到其中一个部分?
问题描述
我在将部分添加到动态视图时遇到问题。我想要 4 个不同的部分,但我只想通过我的文本字段添加到其中一个部分。
我在这里尝试过这种方法:How to deal with dynamic Sections and Rows in iOS UITableView
我相信这是正确的,但是当我添加一些东西时它没有显示出来,这意味着我必须返回一些错误的东西吗?我只是无法解决这个问题!
下面的代码中没有来自上面的stackoverflow问题的任何代码!
// Recipe App
// Created by Stefan Fletcher on 06/08/2019.
// Copyright © 2019 Stefan Fletcher. All rights reserved.
import UIKit
import RealmSwift
import ChameleonFramework
class TodoListViewController: SwipeTableViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var searchBar: UISearchBar!
let realm = try! Realm()
var todoItems: Results<Item>?
var selectedCategory: Category? {
// Specify what should happen when a variable gets set with a new value
didSet{
loadItems()
}
}
let copyFoodIconList: NSArray = NSArray()
override func viewDidLoad() {
super.viewDidLoad()
textField.returnKeyType = UIReturnKeyType.done
self.textField.delegate = self
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedString.Key.foregroundColor: UIColor.darkGray,
NSAttributedString.Key.font: UIFont(name: "Avenir Next", size: 20)!]
}
let copiedFoodIconList : FoodIconList = FoodIconList()
override func viewWillAppear(_ animated: Bool) {
title = selectedCategory!.name
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedString.Key.foregroundColor: UIColor.darkGray,
NSAttributedString.Key.font: UIFont(name: "Avenir Next", size: 20)!]
let backButton = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
self.navigationItem.backBarButtonItem = backButton
self.view.backgroundColor = JDColor.appSubviewBackground.color
}
// MARK: - Tableview Datasource Methods
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return todoItems?.count ?? 1
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Use super class Prototype Cell on storyboard
let cell = super.tableView(tableView, cellForRowAt: indexPath)
if let item = todoItems?[indexPath.row] {
cell.textLabel?.text = item.title
self.tableView.rowHeight = 58.0
cell.accessoryType = item.done ? .checkmark : .none
cell.textLabel?.textColor = UIColor.darkGray
cell.textLabel?.font = UIFont(name:"Avenir Next", size:18)
} else {
cell.textLabel?.text = "No Items Added"
}
return cell
}
// MARK: - TableView Delegate Methods
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let item = todoItems?[indexPath.row] {
do {
try realm.write {
// DELETE using Realm method called delete()
// realm.delete(item)
item.done = !item.done
}
} catch {
print("Error update done status, \(error)")
}
}
tableView.reloadData()
tableView.deselectRow(at: indexPath, animated: true)
}
// TODO: 4
// MARK: - Model Manipulation Methods
func loadItems() {
//READ using Realm
todoItems = selectedCategory?.items.sorted(byKeyPath: "title", ascending: true)
tableView.reloadData()
}
// MARK: - Delete Data From Swipe. Call method from super class
override func updateModel(at indexPath: IndexPath) {
if let deletedItem = todoItems?[indexPath.row] {
do {
try realm.write {
realm.delete(deletedItem)
}
} catch {
print("Error deleting item, \(error)")
}
}
}
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
if (text == "\n") {
textView.resignFirstResponder()
}
return true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
//textField code
textField.resignFirstResponder() //if desired
performAction()
return true
}
func performAction() {
if let currentCategory = self.selectedCategory {
do {
// CREATE and UPDATE using Realm method called realm.write()
try self.realm.write {
let newItem = Item()
newItem.title = textField.text!
newItem.dateCreated = Date()
currentCategory.items.append(newItem)
}
}
catch
{
print("Error saving new items, \(error) ")
}
//If text field is empty - Show error message
}
self.tableView.reloadData()
}
}
// MARK: - Implement Search Bar Methods
// Using extension to seperate out functionality
extension TodoListViewController: UISearchBarDelegate {
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
todoItems = todoItems?.filter("title CONTAINS[cd] %@", searchBar.text!).sorted(byKeyPath: "dateCreated", ascending: true)
tableView.reloadData()
}
// Finish write on search bar, change condition to the first view
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text?.count == 0 {
loadItems()
// Being run in the background
DispatchQueue.main.async {
searchBar.resignFirstResponder()
}
}
}
}
预期的结果应该是应该创建 4 个部分,其中一个部分应该用文本字段填充。就像我的代码已经不在整个表格中,而是在其中一个部分中
解决方案
在您的代码中,您缺少
func numberOfSections(in tableView: UITableView) -> Int {
return todoItems?.count ?? 1
}
然后你的行数应该这样设置:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return todoItems[section]?.count ?? 1
}
为了使它起作用,您todoItems
应该是数组数组,
推荐阅读
- angular - 在角度组件内接收 POST 数据
- c++ - 构建器模式实现中的不完整类型错误
- php - 如何在 laravel 中以不同的样式显示帖子元素?
- java - lambda 表达式中的错误返回类型 String 无法转换为 Object
- python - 如何读取整数范围为 0-255(表示图像的灰度像素)的文本文件并转换为二维数组?
- java - 如何对 Set 进行分片?
- c - 是否可以通过 IPC 消息传递队列发送信号?
- java - NoSuchMethodError:org.junit.platform.commons.util.ReflectionUtils.tryToLoadClass
- vue.js - 根据当前路由动态显示组件,vuejs
- javascript - 如何让两个三JS对象同时运行和动画?