如何将UITableView设置为分组样式


89

我有一个UITableViewController带有部分的子类。这些部分以默认样式显示(无圆角)。如何在代码中将TableView样式设置为分组?我没有为此使用Interface Builder,所以我需要类似

[self.tableView setGroupedStyle]

我搜索了Stack Overflow,但找不到答案。


迅捷版:链接
Juan Boero

Answers:


107

如果我理解您的意思,则必须使用该样式初始化控制器。就像是:

myTVContoller = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped];

3
如前所述,它不是可以更改的属性。一个分组总是分组。
科里·弗洛伊德

这不是一个正确的答案,它不能解决拥有UITableViewController子类的问题。如果继承UITableViewController,则必须重写构造函数,而不创建另一个UITableView或UITableViewController。
米凯尔

如问题所述,如果它是子类化的控制器,您将如何处理?
伊桑·赵

130

您可以执行以下操作:

UITableView *myTable = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

斯威夫特3:

let tableView = UITableView.init(frame: CGRect.zero, style: .grouped)

12
这是真正的解决方案!谢谢。接受的答案是错误的,至少对于OS 3.0+
Duck

4
请注意,接受的解决方案中有错字。我已经修复了。这两个答案都对我有用,但是它们实例化了不同的事物。这个答案是一个UITableView,被接受的答案是一个UITableViewController

3
实际上,被接受的答案具有误导性。请阅读OP所说的“我有UITableViewConotroller子类”。接受的答案仅给您一个简单的UITableViewController;如果不知道细节,就不可能解决用户有关子类的问题。恕我直言,这个答案和使用self.myTable可能会更好。
Feloneous Cat

这也适用于iOS8上的约束(不了解iOS7)...只需使用框架和CGRectZerotableview样式进行初始化,然后添加约束,即可获得正确的样式以及约束。
Glen Selle 2014年

20

我给你我的解决方案,我正在“ XIB模式”下工作,这里是UITableViewController的子类的代码:

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithStyle:UITableViewStyleGrouped];
    return self;
}

6
请注意此解决方案-如果该解决方案在NIB中的navigationController下,它将丢失该引用,并让您感到非常困惑。
Jesse Millikan

14

下面的代码对我有用,我也在使用UITableview类

- (id)initWithStyle:(UITableViewStyle)style
{
     self = [super initWithStyle:UITableViewStyleGrouped];

     if (self)
    {

     }
    return self;
}

1
对于使用UITableViewController子类的人来说,这是正确的解决方案。谢谢!
乍得Pavliska,2015年

9

如果要继承UITableViewController,则可以再次初始化tableView。

目标C:

self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

迅速:

self.tableView = UITableView(frame: CGRect.zero, style: .grouped)

6

设置并不像问题中提到的那么难。其实很简单。在情节提要上尝试一下。

在此处输入图片说明


如果您已经将TableView作为TableViewController设置的一部分,则这种方式是最好的。其他答案更注重实例化一个新的tableView等
KARTHIK卡纳安

3

斯威夫特4

使用普通TableView

let tableView = TableView(frame: .zero, style: .grouped)

使用TPKeyboardAvoidingTableView

let tableView = TPKeyboardAvoidingTableView(frame: .zero, style: .grouped)


2

对于在ui本身中设置分组样式:-选择TableView,然后将“样式”(在属性检查器中)从普通更改为“分组”。


2

如果要在已经在单独的swift文件中创建的子类上使用它,也可以执行此操作(可能不是100%正确,但可以使用)

override init(style: UITableViewStyle) {
    super.init(style: style)
    UITableViewStyle.Grouped
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

现在在appdelegate.swift中,您可以调用:

let settingsController = SettingsViewController(style: .Grouped)

1

您也可以使用情节提要/ XIB来做到这一点

  1. 转到情节提要->选择viewController->选择表
  2. 在interface-builder中选择“样式”属性
  3. 选择“分组”
  4. 完成了

0

如果您拥有一个用于更多表的TableView,并且其中一个表被分组而另一个表被分组,则可以使用UITableViewDelegate中的函数来模拟普通样式:

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {   
    return CGFloat.min
}

0

迅捷4

如果您不想使用情节提要,这可能会有所帮助。

您可以在闭包中添加表视图并设置属性:

lazy var tableView: UITableView = {
        let tableView = UITableView(frame: .zero, style: .grouped)

        tableView.backgroundColor = UIColor(named: Palette.secondaryLight.rawValue)
        tableView.rowHeight = 68
        tableView.separatorStyle = .none
        tableView.translatesAutoresizingMaskIntoConstraints = false
        return tableView
    }()

然后添加子视图并设置约束。


-5

您还可以尝试使分隔线的颜色清晰可见,以产生分组样式效果:

[myTVContoller.tableView setSeparatorColor:[UIColor clearColor]];

部分不会以这种方式折叠。
brduca


-27
self.tableView.style = UITableViewStyleGrouped

编辑:

假设这是一个读/写属性。在这种情况下,您可以遵循Dimitris的建议并在实例化控制器时设置样式,或者(如果使用的是XIB)则可以通过IB进行设置。


谢谢回复。我没有使用XIB,我有一个带有子视图的选项卡控制器,这是我的自定义类。不知道我可以在哪里放置initWithStyle调用,我没有找到TableView的init,而是由tab控制器完成的。在TableViewController中更改initWithStyle似乎无效。

正如dimitris所说,如果您不使用XIB,则必须在某个地方初始化UITableViewController 。那就是您要使用initWithStyle:调用的地方。
drewh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.