如何以编程方式设置 UITableView 部分标题(iPhone/iPad)?
Posted
技术标签:
【中文标题】如何以编程方式设置 UITableView 部分标题(iPhone/iPad)?【英文标题】:How to set the UITableView Section title programmatically (iPhone/iPad)? 【发布时间】:2012-05-17 08:31:59 【问题描述】:我在 Interface Builder 中使用 storyboards
创建了一个 UITableView
。 UITableView
设置有 static cells
和许多不同的部分。
我遇到的问题是我正在尝试以几种不同的语言设置我的应用程序。为此,我需要能够以某种方式更改 UITableView
部分标题。
请问有人可以帮我吗?理想情况下,我想使用IBOutlets
来解决这个问题,但是我怀疑在这种情况下这甚至是不可能的。任何意见和建议将不胜感激。
提前致谢。
【问题讨论】:
【参考方案1】:将 UITableView delegate
和 datasource
连接到控制器后,您可以执行以下操作:
ObjC
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
NSString *sectionName;
switch (section)
case 0:
sectionName = NSLocalizedString(@"mySectionName", @"mySectionName");
break;
case 1:
sectionName = NSLocalizedString(@"myOtherSectionName", @"myOtherSectionName");
break;
// ...
default:
sectionName = @"";
break;
return sectionName;
斯威夫特
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
let sectionName: String
switch section
case 0:
sectionName = NSLocalizedString("mySectionName", comment: "mySectionName")
case 1:
sectionName = NSLocalizedString("myOtherSectionName", comment: "myOtherSectionName")
// ...
default:
sectionName = ""
return sectionName
【讨论】:
如果您使用静态单元设置故事板,您确定实际上会调用它吗?我似乎没有被调用。 啊,看来您必须实现numberOfSectionsInTableView:tableView:
才能调用它。
对于静态单元格,(大多数)所有其他数据源方法都没有实现。
@drewish numberOfSectionsInTableView:tableView:
在 IB 中为静态单元格实现。
drewish 是对的——如果你实现了 numberOfSectionsInTableView:
,那么 title 方法就会被调用并覆盖故事板。由于这是一个静态表格视图,因此可以使用返回常数的方法覆盖它@wcochran【参考方案2】:
如果你在 Swift 中编写代码,它看起来像这样的示例
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?
switch section
case 0:
return "Apple Devices"
case 1:
return "Samsung Devices"
default:
return "Other Devices"
【讨论】:
【参考方案3】:使用 UITableViewDataSource 方法
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
【讨论】:
【参考方案4】:titleForHeaderInSection是一个UITableView的委托方法所以应用section的header文本写如下,
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
return @"Hello World";
【讨论】:
【参考方案5】:注意如果- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
在UITableView的委托中实现,则-(NSString *)tableView:
titleForHeaderInSection:
不会被UITableView调用;
【讨论】:
【参考方案6】:我不知道过去版本的 UITableView
协议,但在 ios 9 中,func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?
是 UITableViewDataSource
协议的一部分。
class ViewController: UIViewController
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad()
super.viewDidLoad()
tableView.dataSource = self
extension ViewController: UITableViewDataSource
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?
return "Section name"
您无需声明 delegate
即可用数据填充您的表格。
【讨论】:
extension
似乎不需要 Swift 5.3。 Xcode 构建消息:“'SettingsViewController' 从这里的超类继承对协议 'UITableViewDataSource' 的一致性”【参考方案7】:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
return 45.0f;
//set height according to row or section , whatever you want to do!
部分标签文本已设置。
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
UIView *sectionHeaderView;
sectionHeaderView = [[UIView alloc] initWithFrame:
CGRectMake(0, 0, tableView.frame.size.width, 120.0)];
sectionHeaderView.backgroundColor = kColor(61, 201, 247);
UILabel *headerLabel = [[UILabel alloc] initWithFrame:
CGRectMake(sectionHeaderView.frame.origin.x,sectionHeaderView.frame.origin.y - 44, sectionHeaderView.frame.size.width, sectionHeaderView.frame.size.height)];
headerLabel.backgroundColor = [UIColor clearColor];
[headerLabel setTextColor:kColor(255, 255, 255)];
headerLabel.textAlignment = NSTextAlignmentCenter;
[headerLabel setFont:kFont(20)];
[sectionHeaderView addSubview:headerLabel];
switch (section)
case 0:
headerLabel.text = @"Section 1";
return sectionHeaderView;
break;
case 1:
headerLabel.text = @"Section 2";
return sectionHeaderView;
break;
case 2:
headerLabel.text = @"Section 3";
return sectionHeaderView;
break;
default:
break;
return sectionHeaderView;
【讨论】:
【参考方案8】:其他答案没有错,但这个答案提供了一个 可能在以下情况下有用的非编程解决方案 有一个小的静态表。好处是可以组织 使用情节提要进行本地化。可继续出口 通过 XLIFF 文件从 Xcode 本地化。 Xcode 9 还有几个new tools to make localizations 更方便。
(原创)
我也有类似的要求。我的 Main.storyboard(Base) 中有一个带有静态单元格的静态表。使用 .string 文件本地化章节标题,例如Main.strings(German) 只需选择情节提要中的部分并记下对象 ID
然后转到您的字符串文件,在我的情况下为 Main.strings(German) 并插入翻译,如:
"MLo-jM-tSN.headerTitle" = "Localized section title";
其他资源:
Apple WWDC 2017 Medium Article on Localization ~ Xcode 9 / Swift 4【讨论】:
以上是关于如何以编程方式设置 UITableView 部分标题(iPhone/iPad)?的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式设置 UITableView 标头的约束以支持 RTL 和 LTR?
如何拥有具有两种不同单元格类型的 UITableView 并以编程方式设置每个单元格布局,而不是通过情节提要?