我正在尝试实施-(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)。好像我正在传递这个对象,但它似乎没有传递......
我哪里错了?
答案 0 :(得分:1)
您正在创建budgetPlan
对象,但在代码中,您从未设置属性name
和amount
。
在viewDidLoad中,您实际上正在准确记录这些属性,这些属性仍然是nil
和NSLog
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];
}
}