我正在处理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没有被调用???
答案 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委托包装在另一个类中并调用该类