与 UITableView 关联的 NSIndexPath

Posted

技术标签:

【中文标题】与 UITableView 关联的 NSIndexPath【英文标题】:NSIndexPath associated with UITableView 【发布时间】:2012-12-09 19:32:41 【问题描述】:

我的主视图上有一个表格视图,我的详细视图上有一个文本字段。该应用程序很简单。添加包含一些信息的表格视图单元格。然后,如果您按下单元格,它会推送详细视图并在文本字段中显示单元格的title/text。在主视图中,我使用的是 NSFetchedResultsController。在第二个视图中,我试图加载数据,但由于某种原因,我没有正确使用我自己的 indexPath 变量,因为每个被按下的单元格都会在详细视图上显示第一个单元格 text。代码:

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

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Set up the cell...
[self configureCell:cell atIndexPath:indexPath];
self.path = indexPath;
    //I have tried this as well.
    //self.path = [NSIndexPath indexPathForRow:indexPath.row inSection:0];
return cell;

详细视图:

-(void)viewWillAppear:(BOOL)animated

if (self.context == nil)



    self.context = [(FBCDAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];



NSFetchRequest *request = [[NSFetchRequest alloc]init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"FailedBankInfo" inManagedObjectContext:self.context];

[request setEntity:entity];

NSError *error;

NSMutableArray *array = [[self.context executeFetchRequest:request error:&error] mutableCopy];

[self setTableArray:array];

FailedBankInfo *infoData = [self.tableArray objectAtIndex:self.root.path.row];

NSString *string = [NSString stringWithFormat:@"%@", infoData.name];

self.nameField.text = string;

string = [NSString stringWithFormat:@"%@", infoData.city];

self.cityField.text = string;

string = [NSString stringWithFormat:@"%@", infoData.state];

self.stateField.text = string;

[super viewWillAppear:YES];


【问题讨论】:

【参考方案1】:

为什么不直接将索引路径传递给详细视图控制器中的

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

方法,带有自定义初始化器:

- (id)initDetailViewControllerWithIndexPath:(NSIndexPath*)indexPath

?

我不熟悉 UIViewController 上的“根”属性,那是什么?这似乎是试图从详细视图控制器中引用第一个视图控制器。您是否检查过 self.root.path.row 返回的内容?

无论如何,您的第一个视图控制器的路径属性与您使用代码的方式选择的单元格无关。它只是设置为加载的最后一个单元格的 indexPath。如果您确实想了解如何从详细视图控制器访问此属性,则必须在 didSelectRowAtIndexPath 方法中进行设置,而不是在 cellForRowAtIndexPath 方法中进行设置。


我认为,如果您在 didSelectRowAtIndexPath 中设置路径,您的方式应该可行。但是要编写自定义初始化程序,请向您的详细视图控制器添加一个名为 path 的属性,然后向详细视图控制器添加一个自定义初始化程序,如下所示:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andIndexPath:(NSIndexPath*)indexPath

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        self.path = indexPath;
    
    return self;

并使用第一个视图控制器的 didSelectRowAtIndexPath 方法调用它

DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle] andIndexPath:indexPath];
[self presentViewController:detailViewController animated:YES completion:nil]; 

(如果您不是从 xib 初始化,请自定义您正在使用的初始化程序)。

或者,您可以传入一个 NSDictionary,其中包含您在详细视图控制器中需要的数据(标题和文本),而不是传入索引路径。

【讨论】:

感谢您的回复。通过pass indexPath 进入详细视图,我该怎么做呢?我还在didSelectRow... 方法中尝试过self.path = [tableView indexPathForSelectedRow];。是的,root 是第一个视图控制器。是的,我NSLog-ed self.root.path.row 并返回0,无论按下什么单元格。好吧,这很有意义。我将尝试在didSelectRowAtIndexPath 方法中设置self.path 变量。再次感谢您! +1,我希望我可以使用 NSDictionary 方法,但是我使用核心数据和 NSFetchedResultsController。但是由于某种原因,这个该死的 indexPath 每次都坚持返回 0。是否有另一种在视图之间传递 indexPath 的方法? (这会是问题吗?)还是它的初始化方式?谢谢!

以上是关于与 UITableView 关联的 NSIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

UITableview 在重新加载时滚动到顶部太高?

与 UITableView 关联的 NSIndexPath

UITableView&UICollectionView设置单元格的默认选中状态

删除表的行

Swift - NSIndex forRow inSection Initializer

ios开发Xcode使用UITableView完成学生信息及成绩的显示