ios - 如何添加动态部分但仍然只添加到其中一个部分?

标签 ios swift xcode uitableview

我在向我的动态 View 添加部分时遇到问题。我想要 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应该是数组的数组,

关于ios - 如何添加动态部分但仍然只添加到其中一个部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57612378/

相关文章:

ios - 使用 NSUserDefaults 在本地存储值

ios - Xcode 项目不显示模拟器列表

ios - 如何防止捏合手势上的 View 超出其父边界 - 快速

ios - 在 Swift 2.0 中子类化 PFUser

ios - 在 Swift 中将城市名称转换为坐标

ios - 如何在仅按下时更改 UIButton 的颜色,如果在 x 秒之前释放则取消颜色更改?

swift - "FIRESTORE INTERNAL ASSERTION FAILED: Invalid document reference. Document references must have an even number of segments, but NewGame has 1"

ios - Xcode Schemes 中如何指定应用数据包?

c++ - Xcode 默认标志从何而来?

ios - 使用 IQKeyBoardManager 时键盘 titleBarButton 的属性文本出现问题