在UITableViews之间传递对象

时间:2012-03-22 22:35:46

标签: objective-c xcode uitableview

我正在尝试实施-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

到目前为止,这是我在第一个UITableViewController中的内容:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    secondviewcontroller *vc = [[secondviewcontroller alloc]init];

    BudgetPlan *tempBudget = [self.budgetElements objectAtIndex:indexPath.row];

    vc.budgetPlan = tempBudget;
}

我的第二个视图控制器有ff:

// secondviewcontroller.h

@property (strong, nonatomic) BudgetPlan *budgetPlan;


//secondviewcontroller.m

@synthesize budgetPlan = _budgetPlan

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"%@ was passed with %@",self.budgetPlan.name, self.budgetPlan.amount);

self.budgetName.text = _budgetPlan.name;
    self.amountBudgeted.text = [NSString stringWithFormat:@"%.02f", _budgetPlan.amount];
}

不幸的是,NSLog显示为零。因此,UILabels budgetName.text和amountBudgeted.text也是空的。

我已将数据源和委托设置为包含UITableView元素的自定义UIViewController(这不是UITableViewController)。好像我正在传递这个对象,但它似乎没有传递......

我哪里错了?

3 个答案:

答案 0 :(得分:1)

您正在创建budgetPlan对象,但在代码中,您从未设置属性nameamount

在viewDidLoad中,您实际上正在准确记录这些属性,这些属性仍然是nilNSLog log(null)。

NSLog(@"%@ was passed with %@",self.budgetPlan.name, self.budgetPlan.amount);

您可以尝试记录budgetPlan本身。你应该得到一个对象内存地址。

答案 1 :(得分:1)

首先,尝试上面的建议(注销budgetPlan对象本身以查看它是否为零)。

如果它不是nil,那么你必须在代码的其他地方查看为什么它上面的属性为零。

如果它为零则问题是你使用viewDidLoad。

您不知道何时调用viewDidLoad。你有两个选择:

1. Don't use viewDidLoad to do that - you could use viewWillAppear instead

2. If second view controller is only ever associated with one budget plan, then don't set the property like that but make a custom init method:

    -(id) initWithBudgetPlan:(BudgetPlan *)plan
    {
       if (self = [super init])
       {
         self.budgetPlan = plan;
       }
       return self;
    }

答案 2 :(得分:0)

谢谢大家。问题似乎是我对故事板的使用。这个

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 方法似乎只在不使用故事板时才有效。

我使用Segues代替了它。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

/*
 When a row is selected, the segue creates the detail view controller as the destination.
 Set the detail view controller's detail item to the item associated with the selected row.
 */

    if ([[segue identifier] isEqualToString:@"showDetailsOfBudget"]) 
    {
        NSIndexPath *indexPath = [self.budgetsTable indexPathForSelectedRow];
        BudgetDetailsViewController *detailsViewController = [segue destinationViewController];
        detailsViewController.budget = [self.budgetPlan.budgets objectAtIndex:indexPath.row];
    }
}