使用已排序的外部数组向内部数组添加其他数据

时间:2014-02-09 06:22:56

标签: ios xcode sorting collation

我有一个带有联系人的plist:root是一个数组,0-150项是字典,每个字典都是一个带有“name”,“number”和“email”字符串的联系人。

下面的代码根据“name”字符串按字母顺序将联系人按部分排序。然后使用内部数组填充每个部分的单元格。然后我将名称从内部数组传递给我的详细视图。

但是,我无法弄清楚如何将每个联系人的正确号码和电子邮件传递到详细信息视图中。我已经在这个问题上工作了很长时间,但找不到解决方案。

@interface ContactsViewController ()
-(void)configureSectionData;
@end

@implementation ContactsViewController
@synthesize tableData;
@synthesize collation;
@synthesize outerArray;
@synthesize indexTitlesArray, namesDictionary;

- (void)didReceiveMemoryWarning 
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}

#pragma mark - Table view methods

-(void)configureSectionData {

NSUInteger sectionTitlesCount = [collation.sectionTitles count];

self.outerArray = [NSMutableArray arrayWithCapacity:sectionTitlesCount];

for (NSUInteger index = 0; index < sectionTitlesCount; index++) {

    NSMutableArray *array = [NSMutableArray array];

    [self.outerArray addObject:array];

}

for (NSString *nameString in tableData)
{
NSInteger sectionNumber = [collation sectionForObject:nameString collationStringSelector:@selector(lowercaseString)];
NSMutableArray *sectionNames = [outerArray objectAtIndex:sectionNumber];
[sectionNames addObject:nameString];
}

for (NSUInteger index = 0; index < sectionTitlesCount; index++) {

    NSMutableArray *namesForSection = [outerArray objectAtIndex:index];

    NSArray *sortedNamesForSection = [collation sortedArrayFromArray:namesForSection collationStringSelector:@selector(lowercaseString)];

    [self.outerArray replaceObjectAtIndex:index withObject:sortedNamesForSection];

}

}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [self.collation.sectionTitles count];
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

NSString *theLetter  = [self.collation.sectionTitles objectAtIndex:section];

if (![theLetter isEqualToString:@"#"]) {
    NSString *titleString = [NSString stringWithFormat:@"%@", theLetter];
    return titleString;
}

return nil;
}

-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return self.collation.sectionTitles;
}

-(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
return [self.collation sectionForSectionIndexTitleAtIndex:index];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

NSArray *innerArray = [self.outerArray objectAtIndex:section];
return [innerArray count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *cellIdentifier = @"cellIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

// Get the inner array for this section
NSArray *innerArray = [self.outerArray objectAtIndex:indexPath.section];

// Get the name from the inner array
NSString *theName = [innerArray objectAtIndex:indexPath.row];

cell.textLabel.text = theName;

return cell;

}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainiPhoneStoryboard" bundle:nil];
DetailViewController *detailView = (DetailViewController *)[storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];

// Get the inner array for this section
NSArray *innerArray = [self.outerArray objectAtIndex:indexPath.section];

// Get the name from the inner array
NSString *tmpname = [innerArray objectAtIndex:indexPath.row];
detailView.lblname = tmpname;

[self presentViewController:detailView animated:YES completion:nil];

}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

self.namesDictionary = [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle]   pathForResource:@"contacts" ofType:@"plist"]];

self.tableData = [namesDictionary valueForKey:@"name"];

self.collation = [UILocalizedIndexedCollation currentCollation];

[self configureSectionData];

}

1 个答案:

答案 0 :(得分:0)

由于您是从plist中的名称数组中填充表,因此您必须使用该名称搜索该数组以查找它所属的字典,因此您可以将其传递给详细信息视图controller(您需要在详细视图控制器中创建一个属性,在我的示例中为passedInDictionary):

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainiPhoneStoryboard" bundle:nil];
    DetailViewController *detailView = (DetailViewController *)[storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];

    // Get the inner array for this section
    NSArray *innerArray = [self.outerArray objectAtIndex:indexPath.section];

    // Get the name from the inner array
    NSString *tmpname = [innerArray objectAtIndex:indexPath.row];
    NSInteger indx = [self.namesDictionary indexOfObjectPassingTest:^BOOL(NSDictionary *dict, NSUInteger idx, BOOL *stop) {
        return [dict[@"name"] isEqualToString:tmpname];
    }];
    NSDictionary *dict = self.namesDictionary[indx];
    detailView.passedInDictionary = dict;

    [self presentViewController:detailView animated:YES completion:nil];
}