0

基本的に、tableView にはある種のバグがあります。tableView が常に正しく更新されていないことに気付きました。デバッグを試みたところ、テーブルを更新するために tableView クラスが常に呼び出されるわけではないことに気付きました。私は何を間違っていますか?テーブルに新しいエントリを追加すると、カウント 4 + 1 になり、履歴タブに移動しても何も起こらず、カウントはまだ 4 と表示されますが、タブをもう一度切り替えると、カウントは 5 と表示され、tableView は次のようになります。更新..何らかの理由で更新が遅れているため、更新ボタンを追加できますが、それはしたくありません..

//
//  SecondViewController.swift
//
//  Created by Artiom Sobol on 1/3/16.
//  Copyright © 2016 Artiom Sobol. All rights reserved.
//

import UIKit

class History: UIViewController, UITableViewDataSource, UITableViewDelegate
{
    // test variable
    var test: MyHistory!
    // array to store unarchived history
    var newHistory = [MyHistory]()

    //outlet for tableview

    @IBOutlet var tableView: UITableView!


    override func viewDidLoad()
    {
        //change the background
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: "newBackground.jpg")!)
        super.viewDidLoad()

        //self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "historyCell")
        //unarchive any new data
        let defaults = NSUserDefaults.standardUserDefaults()

        if let savedPeople = defaults.objectForKey("MyHistory") as? NSData {
            newHistory = NSKeyedUnarchiver.unarchiveObjectWithData(savedPeople) as! [MyHistory]
        }
        tableView.delegate = self
        tableView.dataSource = self
        tableView.reloadData()
    }



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

    func numberOfSectionsInTableView(tableView: UITableView) -> Int
    {
        return 1
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {

        let cell = tableView.dequeueReusableCellWithIdentifier("historyCell", forIndexPath: indexPath) as! historyCell
        let person = newHistory[indexPath.item]
        let defaults2 = NSUserDefaults.standardUserDefaults()

        print("This is count", newHistory.count)

        if let savedPeople = defaults2.objectForKey("MyHistory") as? NSData {
            newHistory = NSKeyedUnarchiver.unarchiveObjectWithData(savedPeople) as! [MyHistory]
        }



       // cell.durationLabel.text = String(person.durationNumber)
        let (hour,minutes,seconds) = secondsToHoursMinutesSeconds(person.durationNumber)

        if(seconds < 10 && minutes < 10)
        {
            cell.durationLabel.text = "0\(hour):0\(minutes):0\(seconds)"
        }
        else if(seconds > 9 && minutes < 10)
        {
            cell.durationLabel.text = "0\(hour):0\(minutes):\(seconds)"
        }
        else if(seconds > 9 && minutes > 9)
        {
            cell.durationLabel.text = "0\(hour):\(minutes):\(seconds)"
        }
        else if(seconds < 10 && minutes > 9)
        {
            cell.durationLabel.text = "0\(hour):\(minutes):0\(seconds)"
        }


        cell.kicksLabel.text = String(person.kicksNumber)

        return cell
    }


    func secondsToHoursMinutesSeconds (seconds : Int) -> (Int, Int, Int)
    {
        return (seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)
    }


}
4

2 に答える 2

0

いくつかのこと:

  1. データをユーザーの既定値に保存した後、synchronize1 回呼び出すと、変更が永続的なストレージに保存されます。

  2. テーブル ビューの各行のデフォルトを赤くしないでください ( tableView(_: cellForRowAtIndexPath:))。代わりに、それらを一度読み取り、データを配列/辞書プロパティに保存し、それを使用して各セルをオンデマンドで構成します。

アドバイス #2 について: ユーザーのデフォルトの読み取りが遅すぎるとは思いませんが、アーカイブされたデータの大きさと、テーブル ビューが画面に表示する必要がある行ごとにそのメソッドが呼び出されるかどうかはわかりません。効率的に!

于 2016-01-25T05:44:28.087 に答える