2012-10-04 148 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