Ios 如何将UITableView设置为分组样式
我有一个带有节的Ios 如何将UITableView设置为分组样式,ios,objective-c,uitableview,cocoa-touch,Ios,Objective C,Uitableview,Cocoa Touch,我有一个带有节的UITableViewController子类。剖面以默认样式显示(无圆角)。如何在代码中将TableView样式设置为“分组”?我没有为此使用Interface Builder,所以我需要 [self.tableView setGroupedStyle] 我搜索了堆栈溢出,但没有找到答案 self.tableView.style = UITableViewStyleGrouped 编辑: 假设这是一个读/写属性。在这种情况下,您可以在实例化控制器时遵循Dimitris的建议
UITableViewController
子类。剖面以默认样式显示(无圆角)。如何在代码中将TableView样式设置为“分组”?我没有为此使用Interface Builder,所以我需要
[self.tableView setGroupedStyle]
我搜索了堆栈溢出,但没有找到答案
self.tableView.style = UITableViewStyleGrouped
编辑:
假设这是一个读/写属性。在这种情况下,您可以在实例化控制器时遵循Dimitris的建议并设置样式,或者(如果您使用的是XIB),您可以通过IB进行设置。如果我理解您的意思,您必须使用该样式初始化控制器。比如:
myTVContoller = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped];
您可以执行以下操作:
UITableView *myTable = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
class SettingsVC: UITableViewController {
init() {
if #available(iOS 13.0, *) {
super.init(style: .insetGrouped)
} else {
super.init(nibName: nil, bundle: nil)
}
}
@available(*, unavailable)
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Swift 3:
let tableView = UITableView.init(frame: CGRect.zero, style: .grouped)
您还可以尝试使分隔线颜色清晰,从而产生分组样式效果:
[myTVContoller.tableView setSeparatorColor:[UIColor clearColor]];
我给你我的解决方案,我在“XIB模式”下工作,这里是UITableViewController子类的代码:
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithStyle:UITableViewStyleGrouped];
return self;
}
您可以使用:
(instancetype)init {
return [[YourSubclassOfTableView alloc] initWithStyle:UITableViewStyleGrouped];
}
下面的代码为我工作,我也使用UITableview类
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:UITableViewStyleGrouped];
if (self)
{
}
return self;
}
对于在ui本身中设置分组样式:-选择TableView,然后将“样式”(在属性检查器中)从普通更改为分组。Swift 4+:
let myTableViewController = UITableViewController(style: .grouped)
如果您想在已在单独的swift文件中创建的子类上使用它,也可以这样做(可能不是100%正确,但有效) 现在在appdelegate.swift中,您可以调用:
let settingsController = SettingsViewController(style: .Grouped)
如果一个TableView用于多个表,并且其中一个表已分组,而另一个表为普通,则可以使用UITableViewDelegate中的函数模拟普通样式:
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.min
}
您也可以使用故事板/XIB来实现这一点
这并不像问题中提到的那么难。其实很简单。在故事板上试试这个
如果您要继承UITableViewController,您可以再次初始化tableView 目标C:
self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
斯威夫特:
self.tableView = UITableView(frame: CGRect.zero, style: .grouped)
Swift 4
let tableView = TPKeyboardAvoidingTableView(frame: .zero, style: .grouped)
使用普通的TableView
let tableView = TableView(frame: .zero, style: .grouped)
使用TPKeyboardAvoidingTableView
let tableView = TPKeyboardAvoidingTableView(frame: .zero, style: .grouped)
swift 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
}()
然后添加子视图并设置约束。如果在代码中创建UITableView,则可以执行以下操作:
UITableView *myTable = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
class SettingsVC: UITableViewController {
init() {
if #available(iOS 13.0, *) {
super.init(style: .insetGrouped)
} else {
super.init(nibName: nil, bundle: nil)
}
}
@available(*, unavailable)
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
谢谢你的回复。我没有使用XIB,我有一个带有子视图的选项卡控制器,它是我的自定义类。我不确定我可以把initWithStyle调用放在哪里,我没有做TableView init,它是由tab控制器完成的。在TableViewController中更改initWithStyle似乎不起作用。正如dimitris所说,如果您没有使用XIB,那么您必须在某处初始化UITableViewController。这就是您想要使用initWithStyle:call的地方。正如所述,它不是一个可以更改的属性。一个分组总是分组的。这不是一个正确的答案,它不能解决拥有UITableViewController子类的问题。如果继承UITableViewController,则必须重写构造函数,而不是创建另一个UITableView或UITableViewController。如问题中所述,如果它是子类控制器,您将如何执行此操作?这是真正的解决方案!谢谢被接受的答案是错误的,至少对于OS 3.0+来说,请注意,被接受的解决方案中有一个输入错误。我现在已经修好了。这两个答案对我都适用,但它们例示了不同的事情。这个答案是一个
UITableView
,被接受的答案是一个UITableView控制器
。实际上,被接受的答案是误导性的。请阅读OP所说的“我有一个UITableViewConotroller子类”。接受的答案只会给你一个简单的jane UITableViewController;如果不知道细节,就不可能解决用户关于子类的问题。这个答案和使用self.myTable可能会更好,IMHO。这也适用于iOS8上的约束(不知道iOS7)…只需使用CGRectZero
框架和tableview样式进行初始化,然后添加约束,即可获得正确的样式和约束。此解决方案的注意事项-如果此解决方案位于NIB中的navigationController下,它将丢失该引用并使您感到困惑。对于使用UITableViewController子类的人来说,这是正确的解决方案。谢谢Swift版本:分区不会以这种方式折叠。如果您已经将tableView作为TableViewController的一部分,则最好以这种方式进行设置。其他答案更侧重于实例化新的tableView等。