我正在创建抽认卡应用,现在正在创建用户创建抽认卡的界面。我最初将它设置为在用户无法添加另一张卡片(添加另一张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
}
这是我现在在自定义表中看到的内容ViewCell
// MARK: Outlets
@IBOutlet var termTextView: UITextView!
@IBOutlet var definitionTextView: UITextView!
同样,我的问题是:当按下按钮(保存)时,如何将所有tableViewCells内部的textViews内部的文本放入字典中?
谢谢您的帮助!
最佳答案
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
}
}
为了在用户修改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
的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
为值。