2015-06-15 10 views
6

ich ein Problem mit meinem TableViewCell mitTableViewCell überlappt Text

Ich habe zwei Zellart in meinem Drehbuch. Wenn ich blättern, überschneidet sich der Text in einigen Zellen. Ich versuche alles, aber ich weiß nicht, wie ich das sonst tun soll. ich danke Ihnen sehr für die Hilfe

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

     var storeNew = systemsBlog.getStore(listNews[indexPath.row].getIdStore()) 
     var newNotice = listNews[indexPath.row] 

     let cell = tableView.dequeueReusableCellWithIdentifier("TimelineCell", forIndexPath: indexPath) as? TimelineCell 

       cell!.nameLabel.text = storeNew.getName() 
       cell!.postLabel?.text = newNotice.getText() 
       cell!.postLabel?.numberOfLines = 0 
       cell!.dateLabel.text = newNotice.getDate() 
       cell!.typeImageView?.tag = indexPath.row; 
       return cell! 
} 



class TimelineCell : UITableViewCell { 

    @IBOutlet var nameLabel : UILabel! 
    @IBOutlet var postLabel : UILabel? 
    @IBOutlet var dateLabel : UILabel! 

    override func awakeFromNib() { 
    postLabel?.font = UIFont(name: "Roboto-Thin", size: 14) 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 
    } 

enter image description here

+0

Ich kann TimelineCell sehen, wo der andere Typ ist? – Icaro

+0

Dies kann passieren, wenn Zellen wiederverwendet werden und kontinuierlich Subviews in der Zelle für die Zeilenmethode hinzugefügt werden. Ich kann jedoch nichts in dem von Ihnen geposteten Code sehen. Gibt es mehr Code? –

+0

@lcaro, der andere Typ verwende ich nicht, weil ich jetzt versuche, dieses Problem zu lösen. – Carol

Antwort

5

Ich kann das Problem beheben. Im Storyboard wurde das Label "Grafikkontext löschen" deaktiviert. Ich habe überprüft und für jetzt ist es gelöst! Danke für die Hilfe!

+0

Habe viele Hacks ausprobiert. nur diese einfache Sache half. Vielen Dank. – Bindi

0

ich mit einem meiner UITableViews in der Vergangenheit ein ähnliches Problem hatte. Es gibt eine Menge Dinge, die das verursachen könnten, aber vielleicht ist es das Gleiche, was mir passiert ist.

Ich sehe, dass Sie eine benutzerdefinierte TableViewCell verwenden. Was passiert, wenn Sie den Text der Zelle festlegen, wird eine Beschriftungsansicht mit diesem Text hinzugefügt. Jetzt sagen Sie, dass Sie durch die Tabellenansicht scrollen und diese Zelle verschwindet. Wenn Sie diese Zelle wiederverwenden und das Etikett nicht aus der Unteransicht entfernen oder den Text dieses Etiketts erneut auf den gewünschten Text setzen, werden Sie die Tabelle tabellenview erneut mit einem vorherigen Etikett verwenden und ein neues Etikett mit neuem hinzufügen Text dazu, den Text überlappend.

Mein Vorschlag wäre, sicherzustellen, dass Sie nicht weiterhin UIlabels als Unterviews in der TimelineCell-Klasse hinzufügen, sofern keine Beschriftung vorhanden ist. Wenn ein Label vorhanden ist, bearbeiten Sie den Text dieses Labels, nicht das der Zelle.

+0

Hallo, Tyler. Ich füge das Label nicht in die Zelle ein. Ich habe das Label auf dem Storyboard und setze nur den Text. – Carol

0

Per apple documentation:

Die Daten-Source-Implementierung von Tableview der Tabellenansicht: cellForRowAtIndexPath: sollte immer alle Inhalte zurückgesetzt, wenn eine Zelle wiederverwendet.

Es scheint, dass Ihr Problem ist, dass Sie nicht immer postLabel Einstellung, so dass es auf den anderen Zellen zu schreiben, versuchen Sie dies:

//reuse postLabel and set to blank it no value is returned by the function  
let cell = tableView.dequeueReusableCellWithIdentifier("TimelineCell", forIndexPath: indexPath) as? TimelineCell 

      cell!.nameLabel.text = storeNew.getName() 
      if newNotice.getText() != nil{ 
       cell!.postLabel.text = newNotice.getText() 
      } else {cell!.postLabel.text = ''} 
      cell!.postLabel.numberOfLines = 0 
      cell!.dateLabel.text = newNotice.getDate() 
      cell!.typeImageView?.tag = indexPath.row; 
      return cell! 
} 

//Make postLabel mandatory and set the font details in the xcode 
class TimelineCell : UITableViewCell { 
@IBOutlet var nameLabel : UILabel! 
@IBOutlet var postLabel : UILabel! 
@IBOutlet var dateLabel : UILabel! 

override func awakeFromNib() { 
//set this in xcode 
} 

override func layoutSubviews() { 
    super.layoutSubviews() 
} 

auch sicher sein, dass Sie keine UI erstellen Element und Anhängen an die Zelle, als ob Sie müssen Sie entsorgen, bevor Sie die Zelle recyceln.

+0

Danke Icaro, aber ich habe immer noch das Problem .. – Carol

0

können Sie Einstellung versuchen:

override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.rowHeight = UITableViewAutomaticDimension 
     self.tableView.estimatedRowHeight = 44.0 // Set this value as a good estimation according to your cells 
} 

im View-Controller Ihre tableView enthält.

Vergewissern Sie sich die Layoutbeschränkungen in Ihrem TimelineCell eine klar Linie Höhe Einschränkungen definieren

Eine weitere Option reagiert:

tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
return 44.0 // Your height depending on the indexPath 
} 

Immer in der Viewcontroller, die Ihre tableView enthält und nehme ich an, , ist die tableView 's UITableViewDelegate

Hoffe das hilft

0

Setzen Sie die Zelle auf Null, um einen Fehler zu beheben. func Tableview (_ Tableview: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

var cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? ImageCellTableViewCell 
    cell = nil 
    if cell == nil { 
     cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for:indexPath) as? ImageCellTableViewCell 
    } 
    cell.yourcoustomtextTextLabel.text = "this is text" 
    cell.yourcoustomtextImageView.image = image 
    return cell 
}