2016-09-23 74 views
4

我的问题很简单:我的自定义UITableViewCell中的@IBOutlet UIImageView被隐藏,如果我尝试通过cellForRowAtIndexpath方法访问它。UIImageView隐藏在Xcode8和Swift3中

我听说这是一个Swift 3或Xcode 8问题(这是有道理的,因为我刚才更新后有这个问题)。我遇到了与UIImageView相同的问题,并发现它隐藏的原因是因为我在循环中过早地调用它。自从最新更新以来,如果我尝试从nib访问@IBOutlet,我只能在viewDidAppear方法中这样做。如果我在viewDidLoad或viewWillLoad方法中尝试,那么插座会隐藏起来。

在这种情况下,我只是通过代码下面的两行改变从正方形一个UIImageView到圈子:

cell.pictureImageView.layer.cornerRadius = cell.pictureImageView.frame.size.width/2; 
cell.pictureImageView.clipsToBounds = true; 

再次,这仅适用的vieDidAppear方法。有没有UITableViewCell的viewDidAppear方法?我把同样的两行的cellForRowAtIndexPath和图像消失:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: K.Cell, for: indexPath) as! TimelineTableViewCell 

    //Turn profile picture into a circle 
    cell.pictureImageView.layer.cornerRadius = cell.pictureImageView.frame.size.width/2; 
    cell.pictureImageView.clipsToBounds = true; 

    return cell 
} 

我也试了一下在自定义单元格的awakeFromNib方法,同样的事情发生了......图像中消失:

override func awakeFromNib() { 
    super.awakeFromNib() 
    cell.pictureImageView.layer.cornerRadius = cell.pictureImageView.frame.size.width/2; 
    cell.pictureImageView.clipsToBounds = true; 

} 

任何帮助非常感谢,谢谢大家!

干杯,

Ç

回答

2

你太早调用它。 pictureImageView还不知道width呢。 你需要调用layoutIfNeeded

cell.pictureImageView.layoutIfNeeded() 
cell.pictureImageView.layer.cornerRadius = cell.pictureImageView.frame.size.width/2 
cell.pictureImageView.clipsToBounds = true 

圆是:

init  
    UIViewController awakeFromNib 
    loadView // your pictureImageView is loaded here 
    UIView awakeFromNib 
    UIViewController viewDidLoad 
    viewWillAppear 
    viewDidAppear // the properties of your pictureImageView are available here 
+0

我知道我早调用它,这就是问题所在。高度和宽度都是在故事板中设置的,但如果我在cellForRow中进行设置,并在它自然调用之前实例化ImageView,则会丢失imageview的所有其他预设属性。我的问题是**,当*,在循环中,imageview是否被实例化...即,它是什么方法,所以我可以访问它。 –

+0

请参阅我的编辑。也许这有助于你? –

+0

调用layoutIfNeeded,你可以像viewDidAppear –