我仍然是情节提要的新手。我花了两天时间调试此问题。似乎在调用-(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;
    }
}

10-08 06:17
查看更多