2

嘿,我一直在研究交通应用程序一段时间,现在已经被这个问题困扰了一段时间。

我正在使用 iOS 5 和故事板。基本上,当用户选择我使用的一行时,我有一个 UITableView 显示最喜欢的巴士站位置:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Favorite *favorite = [self.favoriteItems objectAtIndex:indexPath.row];

    stopString = favorite.title;
    routeString = favorite.subtitle;
}

使用用户选择的单元格的停止和路线信息,然后我准备一个与我的故事板上的转场相对应的转场,推动一个使用停止名称和路线名称的详细视图控制器来显示来自 plist 的时间。

我对 Objective C 和 iOS 还很陌生,所以我正在使用我朋友告诉我的 segue,但是,这可能是问题所在。转场看起来像这样:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *destination = segue.destinationViewController;
    if ([destination respondsToSelector:@selector(setDelegate:)])
    {
        [destination setValue:self forKey:@"delegate"];
    }
    if ([destination respondsToSelector:@selector(setSelection:)])
    {
        NSString *route = routeString;
        NSDictionary *selection1 = [NSDictionary dictionaryWithObjectsAndKeys:route, @"route", stopString, @"stop", nil];
        [destination setValue:selection1 forKey:@"selection"];
    }
}

在我的 DetailViewController 中的 segue 之后,我在视图 DidLoad 中获取停止和路线信息:

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

    route = [selection objectForKey:@"route"];
    stopName = [selection objectForKey:@"stop"];

    NSLog(@"stopName: %@", stopName);
    NSLog(@"routeName: %@", route);
}

这就是我的问题出现的地方。当我运行模拟器并单击表格视图中的一个单元格时,我被推送到 DVC,但是,stopName 和 routeName 都是空的,因此没有发送或接收任何信息。但是,如果我返回表格并单击另一个单元格,则 routeName 和 stopName 将填充我第一次单击单元格时应该发送的信息。如果我继续这个过程,它会继续发送之前点击过的单元格的信息,而不是当前。

所以基本上信息正在发送,但只有在我经历了两次 segue 之后。显然我希望它在第一时间发送和接收信息,但它被延迟了,让我抓狂。我很感激有人可以给我的任何帮助,因为我已经在互联网上搜索了几天试图解决这个问题,非常感谢您的任何帮助!

4

2 回答 2

6

prepareForSegue:之前被调用didSelectRowAtIndexPath:。这就是为什么你看到的价值观总是落后的原因。

更好的解决方案是在您的方法中获取 stopString 和 routeString 值prepareForSegue:(并且根本不使用didSelectRowForIndexPath:)。这样做的关键是要意识到sender传递给的参数值是prepareForSegue:被点击的 UITableViewCell。您可以使用 UITableView 方法indexPathForCell在表格中获取单元格的 indexPath,然后使用它来查找favoriteItems数组中的数据。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{    
    UITableViewCell *cell = (UITableViewCell*)sender;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];   
    Favorite *favorite = [self.favoriteItems objectAtIndex:indexPath.row];

    stopString = favorite.title;
    routeString = favorite.subtitle;

    UIViewController *destination = segue.destinationViewController;
    if ([destination respondsToSelector:@selector(setDelegate:)])
    {
        [destination setValue:self forKey:@"delegate"];
    }
    if ([destination respondsToSelector:@selector(setSelection:)])
    {
        NSString *route = routeString;
        NSDictionary *selection1 = [NSDictionary dictionaryWithObjectsAndKeys:route, @"route", stopString, @"stop", nil];
        [destination setValue:selection1 forKey:@"selection"];
    }
}
于 2012-08-16T06:14:06.823 回答
0

确保您没有直接将 segue 连接到下一个视图控制器到 tableView CELL。连接到整个 UITableViewController / UIViewController(无论您使用哪个)并命名,例如“segueNameInStoryboard”。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Favorite *favorite = [self.favoriteItems objectAtIndex:indexPath.row];

    stopString = favorite.title;
    routeString = favorite.subtitle;

    /* add this line */
    [self performSegueWithIdentifier:@"segueNameInStoryboard" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{ 
    if([segue.identifier isEqualToString:@"segueNameInStoryboard"])
    {    
        UIViewController *nextViewController = segue.destinationViewController;
        nextViewController.delegate = self;

        NSDictionary *selection1 = [NSDictionary dictionaryWithObjectsAndKeys:routeString, @"route", stopString, @"stop", nil];
        nextViewController.selection = selection1;
    }
}
于 2012-08-16T08:19:22.287 回答