我有两个章节'A-M'和'N-Z',如下所示。我打算添加几个城市,但似乎我的didSelectRowAtIndexPath代码会很长。
什么循环,以及如何实现它,以便我不必添加许多其他的。
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
switch (section) {
case 0:
return @"A-M";
break;
case 1:
return @"N-Z";
break;
default:
break;
}
return nil;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0 && indexPath.row == 0) {
self.cityController.title = @"Bologna";
}
else if (indexPath.section == 0 && indexPath.row == 1) {
self.cityController.title = @"Florence";
}
else if (indexPath.section == 1 && indexPath.row == 0) {
self.cityController.title = @"Naples";
}
else if (indexPath.section == 1 && indexPath.row == 1) {
self.cityController.title = @"Rome";
}
[self.navigationController pushViewController: self.cityController animated: YES];
}
答案 0 :(得分:2)
我会采用不同的方法来编码。因为您在那里对这些城市名称进行了硬编码,所以您将更难以添加/删除/维护代码。在最基本的层面上,您可以在tableview中保留一系列城市。这样您就可以在不更改代码的情况下更改数据。
部首:
@interface MyTableViewController : UITableViewController
@property (nonatomic, strong) NSArray *cities;
@end
实现:
@implementation MyTableViewController
// other code
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *city = self.cities[indexPath.row];
MyCityController *controller = // Init code;
controller.title = city;
NSLog(@"Selected city: %@", city);
}
// Other code
@end
您的数据源应该类似地实现:
- (UITableViewCell *)tableView:(UITableView *) cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CELL_ID = @"CITIES";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CELL_ID];
cell.textLabel.text = self.cities[indexPath.row];
// Other setup code
return cell;
}
您可以使用硬编码值延迟加载它们:
- (void)cities {
if (_cities == nil) {
_cities = @[@"Bologna", @"Florence", @"Milan", @"Naples", @"Rome"];
}
return _cities;
}
或者从viewDidLoad
- (void)viewDidLoad {
if (!self.cities) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"cities" ofType:@"plist"];
NSDictionary *cityDict = [NSDictionary dictionaryWithContentsOfFile:path];
self.cities = [cityDict objectForKey:@"cities"];
}
}
答案 1 :(得分:0)
为什么不填写静态数组,所有这些都可能是这样的
NSArray *strings = @[ @[ @"City1", @"B", @"C" ], @[ @"D", @"E", @"F" ]];
之后就回来吧。
Strings[sectionindex][roeindex];
答案 2 :(得分:0)
您应该拥有适当的数据结构来保存表中每行的数据。在这种情况下,您应该有一个字典数组(或类似的)数组。顶级数组每个部分有一个条目。 section数组在该部分中的每一行都有一个条目。这些条目中的每一个都是字典或一些表示该行数据的自定义对象。这将包括标题和该行数据的其他任何内容。
此数据结构将用于'cellForRowAtIndexPath'和'didSelectRowsAtIndexPath'。基于indexPath,您可以提取字典或自定义类。
所以你的整个'didSelectRowAtIndexPath'变成了几行代码。
答案 3 :(得分:0)
你可以使用switch case来避免if-else.But你是否在tableview中显示这些城市名称并根据选择将该名称发送到cityController?如果是,则不需要使用switch case因为你的方式使用数组显示这些名称,您可以使用indexPath发送该名称。
使用开关盒:
switch(indexPath.section)
{
case 0:
{
switch(indexPath.row)
{
case 0:
stmt;
break;
case 1:
stmt;
break;
}
}
same as case0...
}
答案 4 :(得分:0)
我同意@Wayne Hartman,你不需要for循环,你只需要一个包含所有数据的数组。每次生成(或出列)单元格时调用cellForRowAtIndexPath,如果只是告诉它从数组中加载其标题,如
[cell.textLabel setText:[citiesInItaly objectAtIndex:indexPath.row]
它比硬编码你的手机标题要干净得多。