2016-09-16 1 views
2

Ich bin neu in Swift, aber ich arbeite schon in Objective-C. Ich habe ein Problem beim Einchecken, wenn die Zelle in UITableView wiederverwendet wird oder nicht.wie ViewWithTag in Swift zu verwenden?

let cell = tableView.dequeueReusableCellWithIdentifier(strCellId, forIndexPath:indexPath) as! MGSwipeTableCell 
    cell.backgroundColor = UIColor.clearColor() 

    let SMSObj = self.arraySMSContent[indexPath.row] as! SMSModel 

    let lblMessage = UILabel(frame: CGRectMake(15, 10, Constants.SCREEN_WIDTH/1.4, Constants.SCREEN_HEIGHT/11)) 
    lblMessage.text = SMSObj.strSMSContent 
    lblMessage.textAlignment = NSTextAlignment.Left 
    lblMessage.numberOfLines = 2 
    lblMessage.textColor = UIColor.whiteColor() 
    cell.contentView.addSubview(lblMessage) 

Ich habe MGSwiplebleCell verwendet. Beim Scrollen überlappt sich lblMessage. Sogar wir können nicht überprüfen, ob die Zelle null ist oder nicht. Wie benutzt man viewWithTag in dieser Situation? Thnaks

+0

Warum Sie xib schaffen nicht für '' MGSwipeTableCell? –

+0

Ich habe Xib nicht in meinem gesamten Projekt verwendet. Ich mache alles mit Codierung. @ Mr.UB –

+0

Nebenbei bemerkt, warum verwenden Sie nicht automatische Layouts, wenn Sie alles im Code tun? – GoodSp33d

Antwort

4

Anstatt mit viewWithTag Sie eine benutzerdefinierte Klasse mit der Zellen-Wiederverwendungs ​​Kennung registrieren. Dann können Sie das Etikett Zugriff auf eine Eigenschaft dieser Unterklasse mit:

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.registerClass(CustomCell.self, forCellReuseIdentifier: "CustomCell") 
} 

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

    cell.smsLabel.text = ... 

    return cell 
} 

Wo:

class CustomCell: MGSwipeTableCell { 
    var smsLabel: UILabel = { 
     let label = UILabel() 
     label.translatesAutoresizingMaskIntoConstraints = false 
     label.textAlignment = .Left 
     label.numberOfLines = 2 
     label.textColor = .whiteColor() 

     return label 
    }() 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 

     backgroundColor = .blueColor() 

     contentView.addSubview(smsLabel) 
     NSLayoutConstraint.activateConstraints([ 
      smsLabel.topAnchor.constraintEqualToAnchor(contentView.topAnchor, constant: 5), 
      smsLabel.bottomAnchor.constraintEqualToAnchor(contentView.bottomAnchor, constant: -5), 
      smsLabel.leadingAnchor.constraintEqualToAnchor(contentView.leadingAnchor, constant: 5), 
      smsLabel.trailingAnchor.constraintEqualToAnchor(contentView.trailingAnchor, constant: -5) 
     ]) 

     leftButtons = [MGSwipeButton(title: "Red", backgroundColor: .redColor())] 
     leftSwipeSettings.transition = .Rotate3D; 

     rightButtons = [MGSwipeButton(title: "Green", backgroundColor: .greenColor())] 
     rightSwipeSettings.transition = .Rotate3D; 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     fatalError("not needed") 
    } 
} 
+0

Danke für die Antwort. Ich weiß, dass ich eine benutzerdefinierte Klasse in Swift erstellen kann, aber ich muss auch MGSwipeTableCell (Third Party Library) verwenden. Also ich weiß nicht, wie man das macht –

+1

10 Wenn Sie bemerken, ist meine benutzerdefinierte Klasse _is_ eine Unterklasse von 'MGSwipeTableCell'. Ich habe sogar linke und rechte Tasten eingestellt. – Rob

+0

@HirenPrajapati müssen Sie Unterklasse als Rob erwähnt .. – GoodSp33d

1

Es gibt viele Möglichkeiten, Ihr Problem zu lösen. Bitte versuchen Sie es:

if let lblMessage = cell.contentView.viewWithTag(9999) as? UILabel { //Tag 
    lblMessage.text = SMSObj.strSMSContent 
}else{ 
    let lblMessage = UILabel(frame: CGRectMake(15, 10, Constants.SCREEN_WIDTH/1.4, Constants.SCREEN_HEIGHT/11)) 
    lblMessage.text = SMSObj.strSMSContent 
    lblMessage.textAlignment = NSTextAlignment.Left 
    lblMessage.numberOfLines = 2 
    lblMessage.textColor = UIColor.whiteColor() 
    lblMessage.tag = 9999 //Tag 
    cell.contentView.addSubview(lblMessage) 
} 
+0

Danke. Das ist was ich brauchte. Aber es wirft einen Kompilierungsfehler: Wert des Typs 'UIView' HAT KEINE MITGLIED 'TEXT' (in Ihrer zweiten Zeile) –

+1

Ich bearbeitet, kann ich nicht testen –

Verwandte Themen