我仍然是情节提要的新手。我花了两天时间调试此问题。似乎在调用-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
时,segue的目标视图控制器无法正常工作。
我有一个表格视图,当点击一个单元格时,它需要一个segue
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
VAItem *item = [category itemAtIndex:indexPath.row];
[self performSegueWithIdentifier:@"SegueShowDetail" sender:item];
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"SegueShowDetail"]) {
VADetailViewController *detailViewController = segue.destinationViewController;
detailViewController.item = (VAItem*) sender; // <-- THIS ASSIGNMENT DOES NOT WORK
}
}
我的调试显示,
item
已正确传递给prepareForSegue
,但detailViewController.item
是通配指针。它尚未初始化,并且=
分配没有任何作用。我在VADetailViewController的
viewDidLoad
中设置了一个断点,发现即使分配已完成,item
变量仍然是通配指针地址。@interface VADetailViewController : UIViewController
// data
@property (nonatomic, retain) VAItem *item;
@end
项目也已正确合成。
任何帮助深表感谢
狮子座
最佳答案
如果您使用情节提要segue切换到下一个viewcontroller,则在这种情况下无需使用tableVeiew:didSelectRowAtIndexPath:
。根据您的设置方式,可能会导致问题。
在情节提要中,请确保已将推序列从表视图的Prototype单元绘制到详细信息视图控制器(即从单元格,从tableViewController变为 NOT )。如果您以这种方式设置情节提要,则只要用户选择了一个单元格,就会触发segue。对单元格本身的引用将作为prepareForSegue:sender:
参数传递给sender
。然后,您可以检查该对象以找出在该方法中单击了哪一行。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"SegueShowDetail"]) {
// sender will be the tableview cell that was selected
UITableViewCell *cell = (UITableViewCell*)sender;
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
VAItem *item = [category itemAtIndex:indexPath.row];
VADetailViewController *detailViewController = segue.destinationViewController;
detailViewController.item = item;
}
}