hgpl
hgpl

Reputation: 869

Inserting data from one table to another table

I have two UITableViewController classes, MainTableController and SubTableController.

From AppDelegate class I am calling MainTableController class.

At first this class is empty, and there is button named "show list" in this class. When I click on this button I will go to SubTableController and there I have a list of actions in form of table.
Now if I choose to first cell action then that action name has to come on my first cell of table in MainTableController. But I am not able to print that name in table of MainTableController class.

In SubTableController:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{   
    ActionList * actionListObj = [appDelegate.actionArray objectAtIndex:indexPath.row];  
    self.chooseActions = actionListObj.actionName;
    MainTableController * mainViewController = [[MainTableController alloc] init];      
    [mainViewController getAction:self.chooseActions];
    [self.navigationController dismissModalViewControllerAnimated:YES];
}

In MainTableController:

-(void) viewWillAppear:(BOOL)animated{
    [self reloadData];
}

-(void) reloadData{
    [self.myTableView reloadData];
}

-(void) getAction: (NSString *) actionChoose{        
    self.action = actionChoose;
    [self reloadData];
}       

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    // Configure the cell...
    cell.textLabel.text = self.action;
    return cell;
}

When I debug, in MainTableController I am getting the action in getAction method but in table cell text string is null.

Can anyone please help me regarding this?Where am I going wrong?

Upvotes: 1

Views: 210

Answers (2)

user971401
user971401

Reputation:

You are allocating and initializing a new view controller each time you select a cell in SubTableController.

MainTableController * mainViewController = [[MainTableController alloc] init];

and of course, it isn't the one in place in the navigation stack.

You need to make these two controllers communicate.
I suggest that the sub view controller define a property on the main one, in order to message it when needed.

In SubTableController, add a property and synthesize it :

@property(readwrite, assign) MainViewController *mainViewController;
// and ...
@synthesize mainViewController;

Of course when you push the sub view controller, don't forget to set the property.

// in main view controller
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // alloc/init the sub VC
    subVCInstance.mainViewController = self;
    [self pushViewController:subVCInstance ......

Now when a row is selected in the sub one, message the main one, without alloc/init a new MainViewController object :

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{   
    ActionList * actionListObj = [appDelegate.actionArray objectAtIndex:indexPath.row];  
    self.chooseActions = actionListObj.actionName;
    //MainTableController * mainViewController = [[MainTableController alloc] init];      
    [self.mainViewController getAction:self.chooseActions];
    [self.navigationController dismissModalViewControllerAnimated:YES];
}

This should work just fine.

Upvotes: 1

Ilanchezhian
Ilanchezhian

Reputation: 17478

In didSelectRowAtIndexPath of the SubTableController class, you are allocating new MainTableController to send the data.

MainTableController * mainViewController = [[MainTableController alloc] init];      
[mainViewController getAction:self.chooseActions];

You should not do like that. Because the existing mainview will be different from the newly allocated one. You should use delegate to give back the data. For more info on Protocols and delegates, see here

More example here

Upvotes: 1

Related Questions