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 指定为cardHandler 的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 作为键,definition 作为值 em>。