2

我正在研究 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没有被调用???

4

2 回答 2

2

您的委托对象 ,foo被允许超出范围并在结束时被释放,viewDidLoad当键盘出现时,它不再存在。使其成为视图控制器的 ivar(或属性),或者确保它foo不会超出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);
}
于 2012-10-04T17:32:16.907 回答
0

我猜您的文本字段代表必须实现成为您的文本字段代表。

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

另一个例子是一个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 委托打包到另一个类中并调用该类

于 2012-10-04T17:44:48.180 回答