我正在尝试从一个TableViewController中选择一个详细信息公开按钮(或一行)并转到另一个TableViewController,而不从第一个TableViewController传递任何数据到第二个TableViewController。所以几乎第一个TableViewController充当一个表,它将导航到不同的TableViewControllers,具体取决于所选的详细公开按钮(或行)。
到目前为止,我执行此操作的代码如下所示:
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
NSUInteger rowNumber = [indexPath row];
NSString *categoryCode = [self.categoryCodes objectAtIndex:rowNumber];
self.categoryData = [self.commuterDict objectForKey:categoryCode];
[self performSegueWithIdentifier:@"ShowPlaces" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"ShowPlaces"]) {
PlacesViewController *placesViewController = [segue destinationViewController];
// --> I believe I'm missing something here to access a specific row? <--
}
}
我希望有人可以帮助我!
答案 0 :(得分:2)
您从tableView中的indexPath获取特定行:accessoryButtonTappedForRowWithIndexPath:function。具体来说,被挖掘的行是indexPath.row。 (如果你的表有多个部分,那么你也可以读取indexPath的部分,但听起来你只是使用一个简单的表。)
您可以将当前行存储在变量中,然后在prepareForSegue:sender中读取它以选择去哪里。
答案 1 :(得分:2)
UIViewController的-prepareForSegue:sender:
文档说:
因为segues可以从多个来源触发,所以你可以使用 segue和sender参数中的信息用于定义上下文 对于segue并传递适当的信息。例如,如果 segue起源于表视图,sender参数会 识别用户点击的表格视图单元格。你可以用它 用于在目标视图控制器上设置数据的信息。
鉴于此,我首先查看sender
参数,并期望它是指向表格单元格的指针。如果您知道单元格应该在哪个表中,则可以使用-indexPathForCell:
来检索单元格的索引路径。
答案 2 :(得分:0)
按下详细信息显示按钮时,您可以将segue从视图控制器拖动到要显示的视图。您可以在代码中触发segue,如下所示
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"UpdateData" sender:self];
}
来自奥地利的欢呼声 马丁
答案 3 :(得分:0)
如果您的发件人对象是tableviewcell,则以下代码段应该有效:
NSIndexPath *indexPath = [[[segue sourceViewController] tableView] indexPathForCell:sender];
否则尝试
NSIndexPath *indexPath = nil;
if ([sender isMemberOfClass:[UITableViewCell class]])
{
indexPath = [[[segue sourceViewController] tableView] indexPathForCell:sender];
}
else if ([[sender superview] isMemberOfClass:[UITableViewCell class]])
{
indexPath = [[[segue sourceViewController] tableView] indexPathForCell:(UITableViewCell *)[sender superview]];
}
else if ([[[sender superview] superview] isMemberOfClass:[UITableViewCell class]])
{
indexPath = [[[segue sourceViewController] tableView] indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
}
答案 4 :(得分:0)
您用于准备segue的发件人可以是您想要的任何内容。如果您想知道该行,请发送行或索引路径:
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
NSUInteger rowNumber = [indexPath row];
NSString *categoryCode = [self.categoryCodes objectAtIndex:rowNumber];
self.categoryData = [self.commuterDict objectForKey:categoryCode];
[self performSegueWithIdentifier:@"ShowPlaces" sender:indexPath];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"ShowPlaces"]) {
PlacesViewController *placesViewController = [segue destinationViewController];
// Row information is supplied as the sender
NSIndexPath *indexPath = sender;
}
}
如果要使用实际行,请将其设为发件人
[self performSegueWithIdentifier:@"ShowPlaces" sender:[tableView cellForRowAtIndexPath:indexPath]];