prepareForSegue和tableView的不同行为:didSelectRowAtIndexPath:

时间:2012-06-08 05:21:01

标签: ios5 uitableview segue

我正在测试一个简单的场景,它有一个UITableViewController,它有一个单元格segue到另一个UIViewController。现在在segue期间,我需要将一些信息传递给UIViewController,例如项目的名称和价格。我想测试使用prepareForSegue和didSelectRowAtIndexPath:来传递这两个数据点之间的区别。它似乎与didSelectRowAtIndexPath一起使用:但不是prepareForSegue。做了一些调试后:

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

2 - 如果我使用常规推送segue,如何从didSelectRowAtIndexPath:方法访问“segue.destinationViewController”。

PS:在测试prepareForSegue时,我在IB中设置segue以进行推送,当测试didSelectRowAtIndexPath:时,我将IB中的segue设置为模态。

PS:所有与真实姓名的相似之处都是偶然的!

   -(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;

}

由于

1 个答案:

答案 0 :(得分:2)

你是对的,你不能在prepareForSegue中设置出口属性。您必须将属性传递到另一个属性,然后在目标视图控制器的viewDidLoad中设置outlet的属性。例如:您不能设置标签的文本,您必须创建第二个属性(例如,NSString *labelText)并在viewDidLoad中设置标签的文本(self.label.text = self.labelText)。

您无法访问tableView中的目标视图控制器:didSelectRowAtIndexPath。您必须通过alloc / init来自己创建实例。