我还是故事板的新手。我花了两天时间调试这个问题。调用-(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
项目也正确合成。
非常感谢任何帮助
利奥
答案 0 :(得分:3)
如果您使用storyboard segue转换到下一个viewcontroller,则在这种情况下您不需要使用tableVeiew:didSelectRowAtIndexPath:
。取决于您如何设置可能导致问题的事情。
在你的故事板中,确保你已经从tableview的Prototype Cell中将你的push segue绘制到了详细视图控制器(即来自cellView,来自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;
}
}
答案 1 :(得分:0)
你真的只想使用其中一个
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
将数据传递给下一个视图控制器。如果你想在你的情况下使用后者,那么你需要将代码更改为:
if ([segue.identifier isEqualToString:@"SegueShowDetail"]) {
VADetailViewController *detailViewController = segue.destinationViewController;
detailViewController.item = [catagory itemAtIndex:[self.tableView indexPathForSelectedRow].row];
}
我认为您收到错误是因为您分配了发件人的内容。以下是解释“发件人”应该是什么的文档的参考。
希望这有帮助。