IOS设置自定义委托

时间:2012-10-04 17:24:18

标签: iphone objective-c ios delegates

我正在处理IOS HelloWorld示例,我有一个关于为TextField设置委托的问题。在示例中,它就像从TextField控件拖动到ViewController一样简单。但现在说我想创建一个自定义类来充当我的委托:

#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

如何将此类设置为TextField的委托?据我所知,没有办法通过GUI实现这一目标。我尝试在窗口加载后手动设置委托但没有成功:

#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);
}

我在打开键盘时实际上收到了某种内存异常?有任何想法吗?谢谢。

作为一个附带问题,我应该在哪里始终使用viewDidLoad初始化任何变量?我注意到init没有被调用???

2 个答案:

答案 0 :(得分:2)

您的委托对象foo被允许超出范围,并在viewDidLoad结束时释放,当键盘出现时,它不再存在。将其设置为视图控制器的ivar(或属性),或者确保foo的{​​{1}}不会超出viewDidLoad的范围。

因此,它可能是这样的:

@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);
}

答案 1 :(得分:0)

我猜你的文本域代表必须已实现为你的文本域委托。

委托管理对象之间的通信,这意味着您的自定义委托必须允许对象之间的通信,并且必须提供方法,textfield可以使用...

另一个例子是tableView:

您可以创建一个实现委托的自定义委托,然后调用一些与tableview相关的方法......

此处此代码可能对您有用:

@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

这是你在寻找什么? :)

你可以将myCustomDelegateForTextField委托包装在另一个类中并调用该类