It seems that a label (lblscore) is overlapping if I run my app on iOS8 but not in iOS 7. When I check it, the cell.addSubviews(lblscore)
caused it but I cannot delete it because if I do, that label will not be displayed at all. I'm not using a storyboard.
如果我在iOS8上运行我的应用程序而不是在iOS 7中运行我的应用程序似乎重叠了标签(lblscore)。当我检查它时,cell.addSubviews(lblscore)导致它但我无法删除它,因为如果我这样做,那个标签将根本不显示。我没有使用故事板。
this is my codes in cellForRowAtIndexPath
这是我在cellForRowAtIndexPath中的代码
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
var i = 0
var lblname = UILabel()
var lblmsg = UILabel()
let row = indexPath.row
var forName = ""
var forScore = 0
if let not_me = threads[row]["not_me"] as? NSDictionary{
if let username = not_me["username"] as? String{
forName = username
}
if let score = threads[row]["partner_score"] as? Int{
forScore = score
}
if (not_me == [:]){
if let username = defaults.valueForKey("username") as? String{
forName = username
}
if let score = threads[row]["author_score"] as? Int{
forScore = score
}
}
}
for sub in cell.subviews{
if (sub.subviews.count>6){
for sub1 in sub.subviews{
i++
if ((i>0) && !(i==7)){
switch (i){
case 3:
lblmsg = sub1 as! UILabel
lblmsg.text = ""
lblmsg.text = threads[row]["content"] as? String
lblmsg.sizeToFit()
case 4:
lblname = sub1 as! UILabel
lblname.text = ""
lblname.sizeToFit()
lblname.text = forName
lblname.sizeToFit()
lblname.frame = CGRectMake(40, 10, lblname.bounds.width, lblname.bounds.height+4)
lblmsg.frame = CGRectMake(40, lblname.bounds.height-5, UIScreen.mainScreen().bounds.width-100,50)
case 5:
let lbldate : UILabel = sub1 as! UILabel
lbldate.text = ""
lbldate.sizeToFit()
lbldate.text = threads[row]["timeAgo"] as? String
lbldate.sizeToFit()
lbldate.frame = CGRectMake(UIScreen.mainScreen().bounds.width/3*2, 15, lbldate.bounds.width, 15)
case 6:
let lblscore : UILabel = sub1 as! UILabel
lblscore.text = ""
lblscore.sizeToFit()
lblscore.text = "\(forScore)"
lblscore.sizeToFit()
if(lblscore.bounds.width == 15){
lblscore.frame = CGRectMake(lblname.bounds.width+50, 10, lblscore.bounds.width+5, lblscore.bounds.height+4)}
else{
lblscore.frame = CGRectMake(lblname.bounds.width+50, 10, lblscore.bounds.width+10, lblscore.bounds.height+4)}
default:
print("")
}
}
if (i==7){
let btnDelete = sub1 as! UIButton
btnDelete.tag = row
}
}
}
else{
cell.alpha = 0
let lblscore = UILabel()
let btnDelete = UIButton(frame: CGRectMake(UIScreen.mainScreen().bounds.width-18, 22.5, 22, 30))
btnDelete.tag = row
btnDelete.addTarget(self, action: "openDeleteBar:", forControlEvents: UIControlEvents.TouchUpInside)
lblscore.backgroundColor = UIColor(red: (102/255), green: (193/255), blue: (144/255), alpha: 1)
btnDelete.backgroundColor = UIColor(patternImage: UIImage(named: "grayBin")!)
lblname.text = forName
lblname.sizeToFit()
lblscore.text = "\(forScore)"
lblscore.sizeToFit()
lblname.frame = CGRectMake(40, 10, lblname.bounds.width, lblname.bounds.height+4)
let lblmsg = UILabel(frame: CGRectMake(40, lblname.bounds.height-5, UIScreen.mainScreen().bounds.width-100,50))
lblmsg.text = threads[row]["content"] as? String
if(lblscore.bounds.width == 15){
lblscore.frame = CGRectMake(lblname.bounds.width+40, 10, lblscore.bounds.width+5, lblscore.bounds.height+4)}
else{
lblscore.frame = CGRectMake(lblname.bounds.width+40, 10, lblscore.bounds.width+10, lblscore.bounds.height+4)}
lblscore.layer.borderWidth = 1
lblscore.clipsToBounds = true
lblscore.layer.cornerRadius = 10
lblscore.textAlignment = .Center
let lbldate = UILabel()
lbldate.text = threads[row]["timeAgo"] as? String
lbldate.sizeToFit()
lbldate.frame = CGRectMake(UIScreen.mainScreen().bounds.width/3*2, 15, lbldate.bounds.width, 15)
lblname.fOnt= UIFont(name: "Roboto", size: 15)
lblmsg.fOnt= UIFont(name: "Roboto", size: 13)
lbldate.fOnt= UIFont(name: "Roboto", size: 13)
lblscore.fOnt= UIFont(name: "Roboto", size: 15)
lbldate.textColor = UIColor.lightGrayColor()
lblmsg.textColor = UIColor.lightGrayColor()
lblscore.textColor = UIColor.whiteColor()
cell.selectiOnStyle= .None
cell.addSubview(lblmsg)
cell.addSubview(lblname)
cell.addSubview(lbldate)
cell.addSubview(lblscore)
cell.addSubview(btnDelete)
UIView.animateWithDuration(0.2, delay: 0, options: nil, animations: {
cell.alpha = 1
}, completion: nil)
}
}
return cell
}
0
I hope this will help anyone with this situation. I found the solution by myself. Since my app can run in iOS 8 and iOS 7, the first thing to do is identify the version then identify the cell. To know if the cell is empty ,'cell == nil' will never work since a cell already have 2 subviews (content view and separator) in iOS8. In iOS 7 before you get the cell you have to go through it's wrapper.
我希望这可以帮助处理这种情况的任何人。我自己找到了解决方案。由于我的应用程序可以在iOS 8和iOS 7中运行,因此要做的第一件事是确定版本然后识别单元格。要知道单元格是否为空,'cell == nil'将永远不会工作,因为一个单元格在iOS8中已经有2个子视图(内容视图和分隔符)。在获得单元格之前的iOS 7中,您必须通过它的包装器。
to further explain...
进一步解释......
let version = "\(Array(String(UIDevice.currentDevice().systemVersion))[0])"//get device version
if (version == "7"){//if iOS 7
for wrapper in cell.subviews{//go to the wrapper
if (wrapper.subviews.count==2){//if the wrapper contains the content view and the separator only
//Here you will add the contents of the cell
}
else{//if wrapper has more subview which indicate that it is already filled
var i = 0
for sub in wrapper.subviews{//scan all subviews of wrapper
i++
if (i>2){//delete items 3 and beyond since the content view and separator is in the first 2
sub.removeFromSuperview()//remove them
}
}
//Here you will add the contents of the cell
}
}
}
else{//if iOS 8
if (cell.subviews.count==2){//if the cell contains the content view and the separator only
//Here you will add the contents of the cell
}
else{//if cell has more subview which indicate that it is already filled
var i = 0
for sub in cell.subviews{//scan all subviews of wrapper
i++
if (i>2){//delete items 3 and beyond since the content view and separator is in the first 2
sub.removeFromSuperview()//remove them
}
}
//Here you will add the contents of the cell
}
}
}
Now, when the the table tries to reuse a cell, it will delete the contents of that cell before adding the new contents. I hope this will help many.
现在,当表尝试重用单元格时,它将在添加新内容之前删除该单元格的内容。我希望这会对很多人有所帮助。