C.Johns
C.Johns

Reputation: 10245

Delegate not working properly

I am trying to pass some information between a subview and a parentview on the navigation stack using delegates.

However for some reason when the I execute the delegate from the subview then pop the subview from the navigational controller it never enters the delegate method that is set up in the parent view.. I have tried NSLogs & Breakpoints the thread is defiantly not making it to this delegate method in the main view so I was hoping you could help me out.

First Of all I will show you how I have set up my delegate, where I call it in my subview and then where I set it up in the mainview hopefully you guys will be able to see something I have not so far.

Subview.h // I have left out things not related to the delegate

#import <UIKit/UIKit.h>

//Delegate - Protocol stuff for passing data from this view to the parent view
@protocol PassSearchData <NSObject>
@required
- (void) setManufactureSearchFields:(NSArray *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath;
@end

@interface SecondViewController : UITableViewController <UITableViewDataSource> {
//Delegate (Used to pass information back to parent view)
    id <PassSearchData> delegate;
}
//Delegate (Used to pass information back to parent view)
@property (strong) id delegate;
@end

SecondView.m

#import "SecondViewController.h"
#import "FirstViewController.h"

@implementation SecondViewController

//..

//Delegate (Used to pass information back to parent view)
@synthesize delegate;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    //Access selected cells content (cell.textLabel.text)
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    //Parent view logic (sends info back to the correct cell in parent view)
    if (parentViewSelectedIndexPath.section == 0) 
    {
        if (parentViewSelectedIndexPath.row == 0) 
        {
            //Predicates restrict the values that will be returned from the query
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"MANUFACTURER",cell.textLabel.text];
            filterArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate];

            [[self delegate]setManufactureSearchFields:filterArray withIndexPath:indexPath]; 

//            NSLog(@"Filtered Array = %@", filterArray);
        }
    }
   [self.navigationController popViewControllerAnimated:YES]; //pops current view from the navigatoin stack

}//...

Then this is how I set it up inside the FirstViewController

FirstViewController.h

#import <UIKit/UIKit.h>
#import "VehicleResultViewController.h" //With this included I can now use the PassSearchData delegates of this view for passing data

@interface VehicleSearchViewController : UITableViewController <PassSearchData> {
//..

FirstViewController.m

#import "VehicleSearchViewController.h"
#import "VehicleResultViewController.h" //Subview

//..

#pragma mark - Received data from Sub view delegates

//These are the delegate method for passing data from the child to the parent view (parent being this view, with the delegate being declared in the subview)

- (void) setManufactureSearchFields:(NSArray *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath
{
    manufactureSearchObjectString = [[arrayValues valueForKey:@"MANUFACTURER"] objectAtIndex:0];
    manufactureIdString = [[arrayValues valueForKey:@"MANUFACTURERID"] objectAtIndex:0]; //Restricts Models dataset
    manufactureResultIndexPath = myIndexPath;
}

If anyone knows what I'm missing/doing wrong any help would be really really heapful

any questions let me know.

Solution

In the firstviewcontroller when I go to load the secondviewcontroller inside tableView:didSelectRowAtIndexPath: I forgot to set the secondviewcontrollers delegate before I pushed the view to the navigational stack.. so the missing code was this.

FirstView.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Get the subview ready for use
        VehicleResultViewController *vehicleResultViewController = [[VehicleResultViewController alloc] initWithNibName:@"VehicleResultViewController" bundle:nil];

        //Pass the selected object to the new view controller.
        [self.navigationController pushViewController:vehicleResultViewController animated:YES];

        [vehicleResultViewController setDelegate:self];

//etc

thanks guys.

Upvotes: 2

Views: 673

Answers (2)

Musthafa P P
Musthafa P P

Reputation: 655

I think you are not setting Delegate. After Creation Instanace(object)of SecondViewController ,you have to set Delegate.

ie

SecondViewController *secondObj=[[SecondViewController alloc]initWithNibName:@"SecondViewController"> bundle:nil];

 [secondObj setDelegate:self];

Upvotes: 1

Jerry
Jerry

Reputation: 4480

Ok, first, your delegate should be a weak reference to avoid retain cycles. But I suspect maybe the delegate isn't getting set. Can you show the code where SecondViewController is instantiated and the delegate is set? Can you set a breakpoint at the delegate call and verify that it is not nil?

Upvotes: 2

Related Questions