2014-02-09 102 views
0

我有一個plist與聯繫人:根是一個數組,項目0-150是字典,每個字典是一個單一的聯繫與「名稱」,「數字」,和「email」字符串。添加額外的數據到內部數組與排序的外部數組

以下代碼按字母順序將聯繫人根據「名稱」字符串排序爲多個部分。然後使用內部數組填充每個部分的單元格。然後我將內部數組的名稱傳遞給我的詳細視圖。

但是,我不知道如何將每個聯繫人的正確號碼和電子郵件傳遞到詳細視圖。我一直在研究這個問題很長一段時間,找不到解決方案。

@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]; 

} 

回答

0

既然你從剛剛從你的plist中的名稱的數組填充你的表,你就必須使用該名稱來查找其所屬的字典來搜索陣列,這樣你就可以傳遞到詳細視圖控制器(您需要在您的詳細視圖控制器中創建一個屬性,在我的示例中爲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]; 
} 
+0

這是100%正確的。你教會了我一種傳遞數據的新方法。我非常感謝你的幫助。我一直試圖自己解決這個問題! – user3264086