Dogahe
Dogahe

Reputation: 1430

Delegate method in the first view does not get invoked from the second view

In a view, let's call it firstView I created a secondView as follows and pushed it if certain thing happened in the firstView:

SecondViewController *secondVC = [[secondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];


    [self.navigationController pushViewController:secondVC animated:YES];
    [secondVC release];

Now when I'm in the secondView if let say a button is pressed I want to go back to firstView and also pass back a value from secondView to the firstView (let say an integer value of a textfield from secondView to the firstView).

Here is what I tried:

@protocol SecondViewControllerDelegate;

#import <UIKit/UIKit.h>
#import "firstViewController.h"

@interface SecondViewController : UIViewController <UITextFieldDelegate>
{
    UITextField *xInput;
    id <SecondViewControllerDelegate> delegate;
}

- (IBAction)useXPressed:(UIButton *)sender;

@property (assign) id <SecondViewControllerDelegate> delegate;

@property (retain) IBOutlet UITextField *xInput;

@end

@protocol SecondViewControllerDelegate
- (void)secondViewController:(SecondViewController *)sender xValue:(int)value;

@end

And in the m file

- (IBAction)useXPressed:(UIButton *)sender
{
    [self.delegate secondViewController:self xValue:1234]; // 1234 is just for test
}

And then in the firstView I did:

#import "SecondViewController.h"

@interface FirstViewController : UITableViewController <SecondViewControllerDelegate> {

}

@end

And implemented:

- (void) secondViewController:(SecondViewController *)sender xValue:(int)value
{
    [self.navigationController popViewControllerAnimated:YES];
}

Now, the problem is for one in FirstViewController I get the warning that "No definition of protocol "SecondViewControllerDelegate" is found, and for two the delegate method (last piece of code above) does not get invoked at all. Can somebody please tell me what's wrong?

Upvotes: 2

Views: 209

Answers (3)

Omar Abdelhafith
Omar Abdelhafith

Reputation: 21221

After this line

SecondViewController *secondVC = [[secondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

Add

secondVC.delegate = self;

Also instead of

- (void) secondViewController:(SecondViewController *)sender xValue:(int)value
{
    [self.navigationController popViewControllerAnimated:YES];
}

You should use

- (void) secondViewController:(SecondViewController *)sender xValue:(int)value
{
    [sender popViewControllerAnimated:YES];
}

Upvotes: 1

nsinvocation
nsinvocation

Reputation: 7637

In FirstViewController .h file :

#import "SecondViewController.h"

@interface FirstViewController : UITableViewController <SecondViewControllerDelegate> {

SecondViewController *secondViewController;

}

@end

In implementation file , where you init SecondViewController instance next line assign self to delegate property :

secondViewController.delegate = self;

Next define delegate method :

- (void)secondViewController:(SecondViewController *)sender xValue:(int)value
{
NSLog ("This is a Second View Controller with value %i",value)
}

Upvotes: 1

gregheo
gregheo

Reputation: 4270

For problem 1: The @protocol definition for SecondViewControllerDelegate looks like it's in secondViewController.h; are you sure this file is imported in firstViewController.h? Otherwise it won't know about the protocol.

Problem 2: It might be totally unrelated to problem 1. Are you sure the action is hooked up properly? Can you put a NSLog() call in your useXPressed: to make sure that method is actually getting called when you expect it to?

Upvotes: 0

Related Questions