我正在测试一个简单的场景,它有一个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;
}
由于
答案 0 :(得分:2)
你是对的,你不能在prepareForSegue中设置出口属性。您必须将属性传递到另一个属性,然后在目标视图控制器的viewDidLoad中设置outlet的属性。例如:您不能设置标签的文本,您必须创建第二个属性(例如,NSString *labelText
)并在viewDidLoad中设置标签的文本(self.label.text = self.labelText
)。
您无法访问tableView中的目标视图控制器:didSelectRowAtIndexPath。您必须通过alloc / init来自己创建实例。