从所有TableViewCells获取数据

时间:2016-04-28 01:25:42

标签: ios swift uitableview uitextview

我正在创建一个flashcards应用程序,现在我正在创建用户创建抽认卡的界面。我最初设置的地方是用户无法添加另一张卡(添加另一个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!

同样,我的问题:当按下按钮(保存)时,如何将所有tableViewCell内的textViews内的文本放入字典?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

tableView不应存储数据。数据应保存在您的模型中(数据结构或数据结构保存您的数据独立于tableView)。您应该这样做,以便当单元格滚出屏幕然后重新打开时,您可以恢复其中的数据。

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

按下保存按钮后,您应该将模型中的数据保存到更永久的位置(文件,核心数据,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
    }
}

为了在用户修改textField时收到通知,请将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指定为cardHandler的{​​{1}}:

cell

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作为