Ios5 prepareForSegue和tableView的不同行为:didSelectRowAtIndexPath:

Ios5 prepareForSegue和tableView的不同行为:didSelectRowAtIndexPath:,ios5,uitableview,segue,Ios5,Uitableview,Segue,我正在测试一个简单的场景,该场景有一个UITableViewController,该UITableViewController的单元格顺序是另一个UIViewController。现在,在这个过程中,我需要将一些信息传递给UIViewController,例如商品的名称和价格。我想测试使用prepareForSegue和DidSelectRowatineXpath之间的区别:传递这两个数据点。它似乎适用于DidSelectRowatineXpath:但不适用于prepareForSegue。进行

我正在测试一个简单的场景,该场景有一个UITableViewController,该UITableViewController的单元格顺序是另一个UIViewController。现在,在这个过程中,我需要将一些信息传递给UIViewController,例如商品的名称和价格。我想测试使用prepareForSegue和DidSelectRowatineXpath之间的区别:传递这两个数据点。它似乎适用于DidSelectRowatineXpath:但不适用于prepareForSegue。进行一些调试后:

1-我想知道prepareForSegue是否在destinationViewController上的任何IBOutlet初始化之前发生,因此您无法有效地设置它们。所以prepareforsgue似乎更倾向于传递非IBOutlet属性

2-如果我使用的是常规推送序列,我如何从didselectRowatinexPath:方法访问“segue.destinationViewController”

PS:在测试prepareForSegue时,我将IB中的segue设置为push,在测试DidSelectRowatineXpath:时,我将IB中的segue设置为modal

注:所有与真名的相似之处都是偶然的

   -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"itemDetailSegue"])
    {
        NSIndexPath *indexPath=[self.tableView indexPathForSelectedRow];

        NSString *theItemName=[[self.itemsForSale objectAtIndex:indexPath.row]objectForKey:@"Name"];
        NSString *theItemPrice=[[self.itemsForSale objectAtIndex:indexPath.row]objectForKey:@"Price"];

        JuanDetailVC* juanDetailVC= (JuanDetailVC*) segue.destinationViewController;

        juanDetailVC.itemName.text=theItemName;
        juanDetailVC.itemPrice.text=theItemPrice;
    }
}


-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *theItemName=[[self.itemsForSale objectAtIndex:indexPath.row]objectForKey:@"Name"];
    NSString *theItemPrice=[[self.itemsForSale objectAtIndex:indexPath.row]objectForKey:@"Price"];

    JuanDetailVC* juanDetailVC= (JuanDetailVC*) self.presentedViewController;

    juanDetailVC.itemName.text=theItemName;
    juanDetailVC.itemPrice.text=theItemPrice;

}

谢谢

您说得对,您不能在PrepareForegue中设置门店属性。您必须将属性传递到另一个属性中,然后在目标视图控制器的viewDidLoad中设置插座的属性。例如:无法设置标签的文本,必须创建第二个属性(例如,
NSString*labelText
),并在viewDidLoad中设置标签的文本(
self.label.text=self.labelText


您无权访问tableView:DidSelectRowatineXpath中的目标视图控制器。您必须通过alloc/初始化自己创建实例。

谢谢。关于第二点,如果我必须alloc/init目标视图控制器的实例,我猜我也必须将它推到导航控制器上。如果是这样的话,那么它真的违背了故事板上推送序列的目的。那么,这是否意味着,一般来说,如果1)你是从一个模态视图控制器(像我一样)或2)你是从一个popover 3)或可能是在iPad上访问细节视图控制器,你只使用didSelectRowAtIndexPath方法(相对于prepareForSegue)。换句话说,您的目的地实际上是最后一个场景。Thanx虽然我确信在某些情况下使用didSelectRowAtIndexPath更容易,但我现在想不出任何场景。我想我经常使用prepareForSegue。