Передача объектов между UITableViews - PullRequest
0 голосов
/ 23 марта 2012

Я пытаюсь реализовать -(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 также пусты.

Я установил источник данных и делегатов для пользовательского UIViewController, который содержит элемент UITableView (это не UITableViewController). Кажется, я передаю объект, но он не проходит ...

Куда я иду не так?

Ответы [ 3 ]

1 голос
/ 25 марта 2012

Во-первых, попробуйте приведенное выше предложение (выйдите из самого объекта budgetPlan, чтобы увидеть, равен ли он нулю).

Если это не ноль, то вам придется искать в другом месте кода, чтобы увидетьпочему его свойства равны нулю.

Если оно равно нулю, то проблема заключается в использовании вами 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;
    }
1 голос
/ 23 марта 2012

Вы создаете объект budgetPlan, но в своем коде вы никогда не устанавливаете свойства name и amount.

в viewDidLoad вы фактически регистрируете именно эти свойства, которые по-прежнему nil и NSLog регистрируют (ноль).

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

Вы можете попробовать войти в систему budgetPlan. Вы должны получить адрес памяти объекта.

0 голосов
/ 27 марта 2012

Спасибо всем. Кажется, проблема в том, что я использую раскадровки. Это

-(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];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...