1

我正在测试一个简单的场景,它有一个 UITableViewController,它的单元格连接到另一个 UIViewController。现在,在这个过程中,我需要向 UIViewController 传递一些信息,例如商品的名称和价格。我想测试使用 prepareForSegue 和 didSelectRowAtIndexPath: 来传递这两个数据点之间的区别。它似乎适用于 didSelectRowAtIndexPath: 但不适用于 prepareForSegue。做了一些调试后:

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

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

PS:在测试prepareForSegue时,我将IB中的segue设置为push,而在测试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;

}

谢谢

4

1 回答 1

2

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

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

于 2012-06-08T05:34:05.273 回答