2016-08-21 4 views
0

私は動的にUITableViewを作成し、それに配列を移入します。問題は、ディクショナリでいくつかの変更を加え、それに応じてArrayを再作成し、テーブルビューのデータをリロードすると、以前のセルのデータが残っていて、新しいデータが以前のものに上書きされることです。私は、メソッド呼び出しの順番を変更する、サブビューでviewWithTagを使う、スーパービューからサブビューを取り除くなど、多くの回避策を試しました。ほとんどの回答は古く、 "(cell == nil)私はその道を取っていないのですが。ここでは、コードです:UITableView reloadData()は以前のセルデータを上書きします

var sepetDict: [String: Int] = [:] 

var sepetDictCopy = [String]() 

override fun viewDidLoad() { 
    sepetTableView.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width, sepetDialogView.bounds.size.height) 
    sepetTableView.delegate = self 
    sepetTableView.dataSource = self 
    sepetTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "sepetCell") 
} 

func sepetClick() { 
    sepetDictCopy.removeAll() 
    sepetDictCopy = Array(sepetDict.keys) 
    sepetTableView.reloadData() 
    sepetTableView.removeFromSuperview() 

    self.view.addSubview(sepetDialogView) 
    sepetDialogView.addSubview(sepetTableView) 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let sepetCell = sepetTableView.dequeueReusableCellWithIdentifier("sepetCell", forIndexPath: indexPath) 

    let sepetNameLabel = UILabel() 

    sepetNameLabel.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width/2, 60) 
    sepetNameLabel.center = CGPointMake(25 + sepetDialogView.bounds.size.width/4 , 30) 
    sepetNameLabel.font = sepetNameLabel.font.fontWithSize(13) 
    sepetNameLabel.numberOfLines = 0 
    sepetNameLabel.textAlignment = NSTextAlignment.Left 
    sepetNameLabel.text = sepetDictCopy[indexPath.row] 

    sepetCell.contentView.addSubview(sepetNameLabel) 

    return sepetCell 
} 

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

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return 60 
} 

この場合、私はUIButtonをクリックして、それはUIViewのをポップアップするとのUITableViewはサブビューとして、このUIViewのに追加されます。最初のクリックで、すべてがうまくいきます。 UIViewを閉じてボタンを再度クリックすると、今回のテーブルビューには新しいデータ(正しいデータも)が読み込まれますが、以前のデータは上書きされます。提供されたコードでは、私は配列にデータを追加しないことを知っていますが、問題は同じです。たとえば、 "Pizza"がUILabelで書かれていて、テーブルをリロードしても "Pizza" (以前のラベルでラベルが上書きされていることがわかります)。 "Burger"を配列に追加し、 "Burger"と "Pizza"が表示されますが、今回の "Burger"はインデックス0の前の "Pizza"に書き込まれ、 "Pizza"はインデックス1だけに書き出されます。正しく理解できない場合は、追加情報や問題の写真を提供することもできます。

+1

あなたはストーリーボード内のセルにラベルを追加し、カスタムクラスにリンクするか、 'viewWithTagを使用して、それをつかんでみました'(私はあなたがこの方法を使用して言及したことを知っていますが、私はあなたがそれをどのように使用しているかに関する文脈を持っていません)。おそらく、 'sepetNameLabel'にタグを設定し、新しいラベルを作成して追加する前にそれを取得しようとしているはずです。基本的に上記のコードでは、セルにすでにラベルがある場合でも、別のラベルを追加しています。それがあるかどうかチェックする必要があります(おそらく 'tag'プロパティを見て、最初のラベルを追加する前に' viewWithTag'をチェックする必要があります) – DMCApps

+0

[UITableViewCell addSubview Repeating Object]の重複可能性(http://stackoverflow.com/questions/ 11702635/uitableviewcell-addsubview-repeating-object) –

+0

いくつかのスクリーンショットを提供してもよろしいですか? – KSR

答えて

0

私はかなりviewWithTagメソッドの概念を理解していないように見えます。私は自分のコードを並べ替え、それは働いた。日付の答えとコードまでを探している人のために、ここにある:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var sepetCell: UITableViewCell! = sepetTableView.dequeueReusableCellWithIdentifier("") 

    if (sepetCell == nil) { 
     sepetCell = sepetTableView.dequeueReusableCellWithIdentifier("sepetCell")! 

     let sepetNameLabel = UILabel() 

     sepetNameLabel.tag = 1 

     sepetNameLabel.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width/2, 60) 
     sepetNameLabel.center = CGPointMake(25 + sepetDialogView.bounds.size.width/4 , 30) 
     sepetNameLabel.font = sepetNameLabel.font.fontWithSize(13) 
     sepetNameLabel.numberOfLines = 0 
     sepetNameLabel.textAlignment = NSTextAlignment.Left 

     sepetCell.contentView.addSubview(sepetNameLabel) 
    } 

    let sepetNameLabel = sepetCell.contentView.viewWithTag(1) as! UILabel 
    sepetNameLabel.text = sepetDictCopy[indexPath.row] 

    return sepetCell 
} 
+0

なぜコード内にビューを追加しますか? Interface BuilderでIBOutletsを使用して設計されたカスタムテーブルビューセルを使用する方がはるかに簡単です。あなたが使っているチュートリアルの日付を見てください。その多くは、この場合に 'viewWithTag'のような昔ながらの手順を示唆しています。 – vadian

+0

私はさまざまな画面サイズで作業しており、すべてのサイズが正確に調整されている必要があります。私はその目的のためにストーリーボードを使って同じパフォーマンスを得ることができませんでした。 –

+0

よくある質問;-) – vadian

関連する問題