ios - Swift – 表格 View reloadData 在编辑单元格内容后不起作用

标签 ios swift

在我的应用程序中,我向用户展示了一个条目的表格 View ,当他们点击一个条目时,他们将被带到一个带有 TextView 的屏幕,这样他们就可以编辑该单元格的内容。当他们保存时,他们会转换回 tableView。 问题是当他们返回到 tableView 时数据没有重新加载,它显示的数据与他们编辑单元格内容之前的数据相同

我试过将 self.tableView.reloadData() 放在 viewWillAppearviewDidAppear 中,但都没有用。我已经阅读了很多与此相关的答案,但没有一个有效。我希望得到你的帮助。谢谢!

PastSessionsViewController.swift

class PastSessionsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    var arrayOfEntriesNew: [Entry] = [Entry]()
    let transitionManager = TransitionManager()

    var entry: String?
    var entryDate: NSDate?

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let gradient: CAGradientLayer = CAGradientLayer()
        let arrayColors: [AnyObject] = [
            UIColor(red: 0.302, green: 0.612, blue: 0.961, alpha: 1.000).CGColor,
            UIColor(red: 0.247, green: 0.737, blue: 0.984, alpha: 1.000).CGColor
        ]

        tableView.backgroundColor = nil
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None

        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 168.0

        gradient.frame = view.bounds
        gradient.colors = arrayColors
        view.layer.insertSublayer(gradient, atIndex: 0)

        prepareEntries()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewWillAppear(animated: Bool) {
        self.tableView.reloadData()
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
    }

    func prepareEntries() {
        let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
        let managedObjectContext = appDelegate.managedObjectContext!
        let request = NSFetchRequest(entityName: "Meditation")
        let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
        request.sortDescriptors = [sortDescriptor]
        var error: NSError?

        var showStreak = (top: false, bottom: false)

        let result = managedObjectContext.executeFetchRequest(request, error: &error)
        if let objects = result as? [Meditation] {
            for (index, object) in enumerate(objects) {
                var timeLabel = lengthMinutesLabel(minutesString: lengthMinutes(object.length))

                var entry = Entry(sessionLength: lengthMinutes(object.length), sessionTimeUnit: timeLabel, sessionStartTime: "\(object.date.format())", sessionJournalEntry: object.journalEntry, sessionStreakTop: showStreak.top, sessionStreakBottom: showStreak.bottom)

                arrayOfEntriesNew.append(entry)
            }
        }
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrayOfEntriesNew.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: EntryCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as EntryCell

        let entry = arrayOfEntriesNew[indexPath.row]

        var journalEntry = entry.sessionJournalEntry
        cell.sessionStartTimeLabel.text = entry.sessionStartTime
        cell.sessionJournalEntryLabel.text = journalEntry

        cell.sessionLengthLabel.text = entry.sessionLength
        cell.sessionTimeUnitLabel.text = entry.sessionTimeUnit

        return cell
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // janky but works, probably a better way to do this. Will figure it out after v1
        if sender is UIButton {
            let destinationVC = segue.destinationViewController as ViewController
            destinationVC.showJournalButton = false
        } else {
            let path = self.tableView.indexPathForSelectedRow()!
            let location = path.row

            let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
            let managedObjectContext = appDelegate.managedObjectContext!
            let request = NSFetchRequest(entityName: "Meditation")
            let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
            request.sortDescriptors = [sortDescriptor]
            var error: NSError?

            let result = managedObjectContext.executeFetchRequest(request, error: &error)
            if let objects = result as? [Meditation] {
                var journalVC = segue.destinationViewController as EditJournalViewController

                journalVC.journalEntryCoreDataLocation = path.row
                journalVC.journalEntryToEdit = objects[location].journalEntry
                journalVC.journalEntryToEditTimestamp = objects[location].date

                let transitionManager = self.transitionManager
                transitionManager.presenting = true
                transitionManager.direction = "left"
                journalVC.transitioningDelegate = transitionManager
            }
        }
    }
}

最佳答案

viewWillAppear中添加prepareEntries()

关于ios - Swift – 表格 View reloadData 在编辑单元格内容后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28936322/

相关文章:

jquery - html5 jquery底部的空白

ios - 调用中参数 'coder' 缺少参数

ios - 如何检查用户是否允许使用相机?

ios - "Restore purchases"对于绑定(bind)帐户的内容是必需的吗?

swift - 如何使用按钮启用蓝牙 OSX

ios - 点击自定义 UIView 会触发错误的选择器

javascript - ios 的硬件加速 css3 转换

ios - 在 Swift 中将字典对象传递给 Objective C 协议(protocol)

ios - Swift 3 和 Firebase 观察 Child 是否存在

swift - os x nstextfield 验证