2012-10-04 116 views
2

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

#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 

如何设置这个类是文本字段的委托?据我所知,没有办法通过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

什么样的内存异常? –

+1

应该不需要在'SweetAssDelegate'的接口中声明' - (BOOL)textFieldShouldReturn:(UITextField *)theTextField;',因为它已经在你的类实现的'UITextFieldDelegate'中声明了。 –

回答

2

您的代理对象foo被允许超出范围,并在viewDidLoad结束时释放,并且在键盘出现时,它不再存在。使其成为视图控制器的伊娃(或财产),或者确保fooviewDidLoad的末尾不会超出范围。

因此,它可能是这样的:

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

他的财产更好。 –

+0

@SimonGermain我不是特别在乎他是自己定义伊娃,还是让我们的财产为他合成它。关键是他只需要一些视图控制器的范围,而不是'viewDidLoad'。 – Rob

+0

ivars不再“酷”,但+1 cuz你明白了! :P –

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 

这是你在找什么? :)

可以OFC包装myCustomDelegateForTextField委托另一个类中,然后调用类

+1

这并不能解决他的问题,因为你已经在实现中定义了你的委托对象,'txtfielddelegate'将会超出范围。委托对象需要成为视图控制器的@ @接口的一部分,(主接口或私有类扩展)而不是'@实现'。我相信你只是想在这里使用简写,你可能意味着它是视图控制器的ivar /属性,但它似乎是一个重要的点,因为这是他的程序崩溃的原因。 – Rob