IBDesignable在故事板中无法完成更新UITableViewCell。

12

这是一个类似于这个问题,但并不完全相同。

我创建了UITableViewCell的子类,引用了一个自定义的nib文件,并将其标记为@IBDesignable。代码和.xib文件中所做的更改在模拟器和设备上都能正确显示,但在故事板中却不能。

import UIKit

@IBDesignable class TextFieldTableViewCell: UITableViewCell {

    var view: UIView!

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

        setup()
    }

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

        setup()
    }

    func setup() {
        view = loadViewFromNib()
        view.frame = bounds
        view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
        contentView.addSubview(view)
    }

    func loadViewFromNib() -> UIView {

        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: "TextFieldTableView", bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

        return view
    }
}

故事板显示了一个永久的“Designables Updating”。

Designables Updating

将问题分解为仅对UITableViewCell进行子类化并将其标记为@IBDesignable的较简单测试也会导致相同的永久“Designables Updating”问题。

import UIKit

@IBDesignable class TextFieldTableViewCell: UITableViewCell {

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

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

}

有人成功地创建了一个带有@IBDesignable的UITableViewCell子类吗?这是在Xcode 7 beta 6和beta 5中发生的。


我遇到了同样的问题。但是当我将tableViewCell放在正常的ViewController中时,我可以使用IBDesignable。所以,我认为这是XCode的一个bug,无法在TableView中设计cell。 - Justus Jianxing Zhang
1
苹果已经回复了我提交的错误报告,确认这确实是一个bug。 - Hamer
谢谢,帮了很大的忙。 - Justus Jianxing Zhang
我正在使用Xcode 9 GM。它没有这个问题。 - Evan
3个回答

6

此问题已在Xcode 9中解决。

我已向苹果报告了此问题,并且至少知道这是一个已知的错误。它目前是问题ID 17973876下的一个未解决问题。

编辑:截至2016年12月7日,此错误仍标记为未解决。


这个问题目前也发生在我的XCode9上,我该向他们报告此问题吗? - Alan
我刚在我的自定义UIView中放置了一个UICollectionView,但它在Storyboard中也没有渲染出来。我很困惑,不知道问题是出在我的代码还是一个bug! - Soumen

1

我之前也遇到了类似的问题。这个线程帮助我理解了问题:Interface Builder是否有渲染IBDesignable视图但不覆盖drawRect:的方式?

我通过添加以下代码使其工作

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

据我所理解,在阅读上面的Stack链接后,IBDesignable会从initWithFrame中加载Storyboard中的nib,而不是从nib或coder中加载。不太确定,但我认为initWithStyle也在做类似的事情。

添加上述建议的代码没有任何区别。 - Hamer
你是否重写了layoutSubviews()方法并调用了super?我有一些需要的自定义绘图代码,所以实现了这个方法。我发现使用xib非常麻烦,但这可能会有所不同。>override func layoutSubviews() { super.layoutSubviews() } - mxwt
我在Xcode7.2中遇到了同样的问题,但这并没有起到帮助作用。我也不明白实现 layoutSubviews 并仅调用超类版本如何有所帮助——当 layoutSubviews 被调用时,如果未被覆盖,则会自动调用超类版本。 - Alnitak

0

看起来“更新”错误只会在单元格位于故事板中时发生。当您为单元格创建特殊的.xib文件时,一切都正常。

希望他们能尽快修复它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接