【问题标题】:Getting Data From all TableViewCells从所有 TableViewCell 获取数据
【发布时间】:2016-04-28 01:25:42
【问题描述】:

我正在创建一个抽认卡应用程序,现在我正在创建用户创建抽认卡的界面。我最初将它设置为用户无法添加另一张卡片(添加另一个 UITableViewCell),直到当前卡片有一个术语和定义。如果卡片被填写,我会将术语和定义保存到字典中。我意识到部分方法是用户可以返回到前一个单元格并更改单元格中的数据,并且永远不会保存它。我最新的想法是等到用户完成所有单元格的填写,然后保存数据。我似乎找不到获取所有单元格数据的方法。

我现在的 tableViewController 中有什么:

// MARK: Variables

var cards = [Int]()

var cardData = [String : String]()



// MARK: Actions

@IBAction func plusBarButtonItemPressed(sender: AnyObject) {

    self.cards.append(self.cards.count + 1)

    let insertionIndexPath = NSIndexPath(forRow: self.cards.count - 1, inSection: 0)

    tableView.insertRowsAtIndexPaths([insertionIndexPath], withRowAnimation: .Automatic)

}


@IBAction func doneBarButtonItemPressed(sender: AnyObject) {

    // Save each cell into cardData [termTextView.text : definitionTextView.text]

}



// MARK: Functions

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return self.cards.count
}

这就是我现在的 自定义 tableViewCell

中的内容
// MARK: Outlets

@IBOutlet var termTextView: UITextView!

@IBOutlet var definitionTextView: UITextView!

再次,我的问题是:当按下按钮(保存)时,如何将所有 tableViewCells 内的 textViews 内的文本放入字典中?

感谢您的帮助!

【问题讨论】:

    标签: ios swift uitableview uitextview


    【解决方案1】:

    tableView 不应该存储数据。数据应该保存在你的模型中(一个或多个数据结构,它独立于 tableView 保存你的数据)。您应该有这个,以便当单元格从屏幕上滚动然后重新打开时,您可以恢复其中的数据。

    当用户在单元格中输入数据时,您应该立即更新您的模型。

    按下保存按钮后,您应该将模型中的数据保存到更永久的位置(文件、Core Data、SQL 数据库)。


    首先,让我们为CardHandler 定义一个协议:

    protocol CardHandler {
        func totalCards() -> Int
        func writeTerm(term: String, forCard cardNum: Int)
        func writeDefinition(definition: String, forCard cardNum: Int)
        func readTermForCard(cardNum: Int) -> String?
        func readDefinitionForCard(cardNum: Int) -> String?
        func addCard() -> Int
        func removeCardNum(cardNum: Int)
    }
    

    接下来,定义一个类作为你的模型:

    class Cards: CardHandler {
        struct CardRecord {
            var term: String = ""
            var definition: String = ""
        }
    
        var cards = [CardRecord]()
    
        func totalCards() -> Int {
            return cards.count
        }
    
        func writeTerm(term: String, forCard cardNum: Int) {
            if cardNum < cards.count {
                cards[cardNum].term = term
            }
        }
    
        func writeDefinition(definition: String, forCard cardNum: Int) {
            if cardNum < cards.count {
                cards[cardNum].definition = definition
            }
        }
    
        func readTermForCard(cardNum: Int) -> String? {
            if cardNum < cards.count {
                return cards[cardNum].term
            }
            return nil
        }
    
        func readDefinitionForCard(cardNum: Int) -> String? {
            if cardNum < cards.count {
                return cards[cardNum].definition
            }
            return nil
        }
    
        func addCard() -> Int {
            cards.append(CardRecord())
            return cards.count - 1
        }
    
        func removeCardNum(cardNum: Int) {
            if cardNum < cards.count {
                cards.removeAtIndex(cardNum)
            }
        }
    
        func convertToDictionary() -> [String: String] {
            var dict = [String: String]()
    
            for card in cards {
                dict[card.term] = card.definition
            }
    
            return dict
        }
    }
    

    为了在用户修改文本字段时收到通知,请将您的 CustomTableViewCell 类设为 UITextViewDelegate:

    class CustomTableViewCell: UITableViewCell, UITextViewDelegate {
    
        @IBOutlet weak var termTextView: UITextView!
        @IBOutlet weak var definitionTextView: UITextView
        weak var cardHandler: CardHandler?
    
        var rowInTable = 0   // set this in cellForRowAtIndexPath to indexPath.row
    
        override func awakeFromNib() {
            super.awakeFromNib()
    
            termTextView.delegate = self
            definitionTextView.delegate = self
        }
    
        func textViewDidChange(textView: UITextView) {
            let text = textView.text
    
            if textView == termTextView {
                cardHandler?.writeTerm(text, forCard: rowInTable)
            } else if textView == definitionTextView {
                cardHandler?.writeDefinition(text, forCard: rowInTable)
            }
        }
     }
    

    在您的UITableViewController 中,有一个属性来包含您的模型:

    var cards = Cards()
    

    cellForRowAtIndexPath 中,将cards 指定为cardHandlercell

    let cell = dequeReusableCell ... as CustomTableViewCell
    cell.rowInTable = indexPath.row
    cell.cardHandler = cards
    cell.contentView.termTextView.text = cards.readTermForCard(indexPath.row) ?? ""
    cell.contentView.defintionTextView.text = cards.readDefinitionForCard(indexPath.row) ?? ""
    

    对于numberOfRowsInSection

    return cards.totalCards()
    

    对于plusBarButtonItemPressed

    @IBAction func plusBarButtonItemPressed(sender: AnyObject) {
        let newCardNum = cards.addCard()
        let insertionIndexPath = NSIndexPath(forRow: newCardNum, inSection: 0)
        tableView.insertRowsAtIndexPaths([insertionIndexPath], withRowAnimation: .Automatic)
    }
    

    要将您的卡片作为字典,请调用cards.convertToDictionary(),它会返回一个[String: String] 字典,其中term 作为definition 作为值 em>。

    【讨论】:

    • 感谢您的回答,vacawama!我需要一些帮助来了解您如何设置模型。我能够获取 textView 及其 rowInTable 的文本。但是,我不确定如何将术语和定义 textViews 保存到 CardRecord。我可以看到 CardRecord.init(term, definition),但我不确定如何为正确的 rowInTable 保存术语和定义。请指教!
    • 我添加了更多细节。我把这个写在我的头上,所以可能有一些错别字。不过,我认为您可以了解它的要点。
    • 太棒了!我很高兴你让它工作。您可能想要实现textViewDidChange 而不是textViewDidEndEditing。它会被每个角色调用,但你不应该这样错过任何东西。我会给你写一个返回字典的快速例程。
    • 我更新了答案。是的,您可以在用户键入时不断更新术语或定义。
    • 删除行时,应先更新模型,然后再调用deleteRowsAtIndexPaths,否则会出现不一致错误。我会推荐cards.removeCardNum(indexPath.row); tableView.deleteRowsAtIndexPaths([indexPath, withRowAnimation: .Fade); self.tableView.reloadData()
    猜你喜欢
    • 2019-06-28
    • 2022-01-23
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多