执行segue时未加载下一个视图控制器

时间:2012-03-26 03:54:53

标签: iphone objective-c ios cocoa-touch storyboard

我还是故事板的新手。我花了两天时间调试这个问题。调用-(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

项目也正确合成。

非常感谢任何帮助

利奥

2 个答案:

答案 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];
}

我认为您收到错误是因为您分配了发件人的内容。以下是解释“发件人”应该是什么的文档的参考。

https://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/performSegueWithIdentifier:sender

希望这有帮助。