使用代码删除tableview中的额外分隔线时,我在viewcontroller中为tableview创建了一个插座,然后设置
self.tableview.tableFooterView = UIView()
在检查类UIView时,默认初始化程序具有frame参数
class UIView : UIResponder, NSCoding, UIAppearance, NSObjectProtocol, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace {
class func layerClass() -> AnyClass // default is [CALayer class]. Used when creating the underlying layer for the view.
init(frame: CGRect) // default initializer
var userInteractionEnabled: Bool // default is YES. if set to NO, user events (touch, keys) are ignored and removed from the event queue.
var tag: Int // default is 0
var layer: CALayer { get } // returns view's layer. Will always return a non-nil value. view is layer's delegate
}
使用,
self.tableview.tableFooterView = UIView(frame: CGRectZero)
也有效。当UIView类中的默认初始化程序不同(它继承了很多其他类)时,为什么第一种方法有效并且不会出错?除去分隔符的两条线如何不同(如果是),哪一条更有效并应该使用?
答案 0 :(得分:1)
UIView
继承了init()
的{{1}},这就是为什么它有效并且没有任何错误。 Cocoa(Touch)中与 Objective-C 一起使用的每个类都继承自此类(可能除NSObject
之外)。很明显,NSProxy
将UIView
属性默认为frame
,为什么它仍然有效。
我会说你总是和CGRectZero
一起使用,因为它是init(frame:)
的指定初始化程序。它为读者提供了更清晰的意图。 使用 UIView
,您无法确保所有属性的设置都比使用init()
更准确。
完成一些小实验后,我发现init(frame:)
通过传递UIView.init()
来调用UIView.init(frame:)
。所以,我会说两者都完全等同。但是,我仍然建议您使用CGRectZero
,因为它可以向读者表达更明确的意图。但这取决于你的风格。
以下是代码:
init(frame:)
通过调用@interface MyView : UIView
@end
@implementation MyView
- (instancetype)init; {
self = [super init];
if (self) {
NSLog(@"%s", __FUNCTION__);
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
NSLog(@"%s | %@", __FUNCTION__, NSStringFromCGRect(frame));
}
return self;
}
@end
打印:
[[MyView alloc] init];
这是 Swift 版本:
-[MyView initWithFrame:] | {{0, 0}, {0, 0}}
-[MyView init]
然后,您只需在代码中的某处调用class MyView: UIView {
override init() {
super.init()
println(__FUNCTION__)
}
override init(frame: CGRect) {
super.init(frame: frame)
println("\(__FUNCTION__) | \(frame)")
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
println(__FUNCTION__)
}
}
。
答案 1 :(得分:0)
对于Swift 4.0 只需在委托方法中添加以下代码
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}