以下是我正在运行的代码.我有一个带有导航控制器,桌面控制器和视图控制器的故事板设置.我正在尝试从NSDictionary中传递名称,我将该表设置为详细视图控制器.我应该使用prepareforsegue还是didselectrowatindexpath,我如何从字典中取出名字来传递?
#import "FMInBoxViewController.h" #import "FMDetailViewController.h" @interface FMInBoxViewController () @end @implementation FMInBoxViewController @synthesize keyArray; @synthesize tableArray; @synthesize tblDictionary; @synthesize filteredArray; - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *ary=[[NSMutableArray alloc]init]; [ary addObject:@"Adam"]; [ary addObject:@"Fred"]; [ary addObject:@"Angel"]; // ... many similar entries [ary addObject:@"James"]; [ary addObject:@"Mukthesh"]; self.tblDictionary =[self fillingDictionary:ary]; }
表视图数据源
#pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return [keyArray count]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. NSArray *ary = [self.tblDictionary valueForKey:[keyArray objectAtIndex:section]]; return [ary count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; NSString *key = [keyArray objectAtIndex:[indexPath section]]; NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key]; NSString *cellTitle = [array objectAtIndex:[indexPath row]]; cell.textLabel.text = cellTitle; // Configure the cell... return cell; } -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { NSString *title = [keyArray objectAtIndex:section]; return title; } //-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // NSString *key = [keyArray objectAtIndex:[indexPath section]]; // NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key]; // self.selectedName = [array objectAtIndex:indexPath.row]; // NSLog(@"Selected Name in Did select: %@",self.selectedName); // // [self performSegueWithIdentifier:@"showDetail" sender:self]; //} -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"showDetail"]) { NSIndexPath *section = [self.tableView indexPathForSelectedRow]; NSString *key = [keyArray objectAtIndex:section]; NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key]; NSString *cellTitle = [array objectAtIndex:[indexPath row]]; NSLog(@"Selected Name in Did select: %@",self.selectedName); } }
助手方法
#pragma mark - Helper Methods - (NSMutableDictionary *)fillingDictionary:(NSMutableArray *)sentArray { keyArray = [[NSMutableArray alloc] init]; [keyArray removeAllObjects]; NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; [sentArray sortUsingSelector:@selector(compare:)]; for ( NSString *str in sentArray) { NSString *charVal = [str substringToIndex:1]; NSString *charStr = [NSString stringWithString:charVal]; NSLog(@" charStr = %@",charStr); if (![keyArray containsObject:charStr]) { NSMutableArray *charArray = [[NSMutableArray alloc] init]; [charArray addObject:str]; [keyArray addObject:charStr]; [dic setValue:charArray forKey:charStr]; } else { NSMutableArray *prevArray = (NSMutableArray *)[dic valueForKey:charStr]; [prevArray addObject:str]; [dic setValue:prevArray forKeyPath:charStr]; } } return dic; } @end
好的,我改了那个部分看起来像这样
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSString *key = [keyArray objectAtIndex:[indexPath section]]; NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key]; self.selectedName = [array objectAtIndex:indexPath.row]; NSLog(@"Selected Name in Did select: %@",self.selectedName); } -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { FMDetailViewController *dvc = (FMDetailViewController *)segue.destinationViewController; dvc.name = self.selectedName; }
但是现在当我选择行时,名称将不会出现在第一次按下的详细控制器中.如果您返回并选择其他名称,则您按下的名字将显示在视图控制器中.任何关于为什么会发生的建议?
解决方法
你需要使用这两个,在didSelectRowAtIndexPath你应该调用[self performSegueWithIdentifier:@“identifier”sender:self];
在同一个View Controller中,您应该使用prepareForSegue方法从destue中获取destinationViewController,然后在该视图控制器上设置任何要设置的属性.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { self.someProperty = [self.someArray objectAtIndex:indexPath.row]; [self performSegueWithIdentifier:@"segueID" sender:self]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UIViewController *vcToPushTo = segue.destinationViewController; vcToPushTo.propertyToSet = self.someProperty; }