我正在创建抽认卡应用,现在正在创建用户创建抽认卡的界面。我最初将它设置为在用户无法添加另一张卡片(添加另一张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分配为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为值。

10-08 05:29
查看更多