user1437801
user1437801

Reputation: 221

IOS setting a custom delegate

I'm working through the IOS HelloWorld example and I have a question regarding setting the delegate for a TextField. In the example it was as easy as control-dragging from the TextField to the ViewController. But now say I wanted to create a custom class to act as my delegate as so:

#import <Foundation/Foundation.h>
@interface SweetAssDelegate : NSObject <UITextFieldDelegate>
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField;
@end

#import "SweetAssDelegate.h"

@implementation SweetAssDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField
{
    NSLog(@"Calling Delegate");
    [theTextField resignFirstResponder];
    return YES;
}
@end

How can I set this class to be the delegate of the TextField? As far as I can tell there is not way to accomplish this through the GUI. I tried manually setting the delegation after window load with no success:

#import "ViewController.h"
#import "SweetAssDelegate.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *inputField;
@end

- (void)viewDidLoad
{
    [super viewDidLoad];

    SweetAssDelegate *foo = [[SweetAssDelegate alloc] init];
    [self.inputField setDelegate:foo];

    NSLog(@"Delegate: %@", self.inputField.delegate);
}

I actually receive some sort of memory exception when bringing up the keyboard? Any ideas? Thanks.

As a side question, where should I always use viewDidLoad to initialize any variables? I noticed that init was not being called???

Upvotes: 2

Views: 1033

Answers (2)

Rob
Rob

Reputation: 438297

Your delegate object, foo, is allowed to fall out of scope and is released at the end of viewDidLoad and by the time the keyboard comes up, it doesn't exist anymore. Make it an ivar (or property) of your view controller, or otherwise make sure that foo doesn't fall out of scope at the end of viewDidLoad.

Thus, it could be something like:

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *inputField;
@property (strong, nonatomic) SweetAssDelegate *foo;
@end

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.foo = [[SweetAssDelegate alloc] init];
    [self.inputField setDelegate:self.foo];

    NSLog(@"Delegate: %@", self.inputField.delegate);
}

Upvotes: 2

Janosch H&#252;bner
Janosch H&#252;bner

Reputation: 1694

Your textfield delegate must have the implemented to be your textfield delegate I guess.

A delegate manages the communication between objects, which means your custom delegate must allow communication between objects and must provide methods, the textfield can work with...

Another example is a tableView:

You can make a custom delegate which implements the delegates and then calls some tableview related Methods...

Here this code might be interesting for you:

@interface myCustomDelegateForTextFields <UITextFieldDelegate>


@end

@implementation myCustomDelegateForTextFields 

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {

return TRUE;

}

@end

@implementation ViewController 


myCustomDelegateForTextFields *txtfielddelegate = [[myCustomDelegateForTextFields alloc] init];

UITextField *whatever;
whatever.delegate = txtfielddelegate;

//your textfield now listens to the BOOL method in your custom delegate

@end

Is it that what u were looking for? :)

you can ofc pack the myCustomDelegateForTextField delegate in another class and call the class

Upvotes: 0

Related Questions