在Swift中的UITableView中消除空行的额外分隔线

时间:2015-02-13 19:18:33

标签: ios uitableview swift uiview ios8

使用代码删除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类中的默认初始化程序不同(它继承了很多其他类)时,为什么第一种方法有效并且不会出错?除去分隔符的两条线如何不同(如果是),哪一条更有效并应该使用?

2 个答案:

答案 0 :(得分:1)

UIView继承了init()的{​​{1}},这就是为什么它有效并且没有任何错误。 Cocoa(Touch)中与 Objective-C 一起使用的每个类都继承自此类(可能除NSObject之外)。很明显,NSProxyUIView属性默认为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
}