2014-01-08 63 views
0

我想從我的項目的主類中分離UITextViewDelegate方法,我創建了一個類來管理委託方法,但我無法從主類更改IBOulets的值。UITextFieldDelegate不工作

我做了一個ViewController和TextFieldController的測試項目,在Storyboard中我添加了一個文本框和一個標籤。當我開始在文本字段中寫入時,我想要做的是更改標籤的文本。下面是代碼:

ViewController.h:

#import <UIKit/UIKit.h> 
#import "TextFieldController.h" 

@interface ViewController : UIViewController 

@property (strong, nonatomic) IBOutlet UITextField *textField; 
@property (strong, nonatomic) IBOutlet UILabel *charactersLabel; 

@end 

ViewController.m:

#import "ViewController.h" 

@interface ViewController() 

@property (nonatomic, strong) TextFieldController *textFieldController; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    _textFieldController = [[TextFieldController alloc] init]; 
    _textField.delegate = _textFieldController; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

@end 

TextFieldController.h:

#import <UIKit/UIKit.h> 
#import "ViewController.h" 

@interface TextFieldController : UIViewController <UITextFieldDelegate> 

@end 

文本字段Controller.m或者:

#import "TextFieldController.h" 

@interface TextFieldController() 

@property ViewController *viewController; 

@end 

@implementation TextFieldController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (BOOL) textFieldShouldBeginEditing:(UITextField *)textField { 
    NSLog(@"hello"); 
    _viewController.charactersLabel.text = @"hello"; 
    return YES; 
} 

@end 

當我開始在文本字段中寫入消息「Hello」時,會在日誌中打印,但標籤的文本不會更改。我想知道如何更改其他類的標籤文本值。

回答

0

先改變TextFieldController.h這樣的:

#import <UIKit/UIKit.h> 
#import "ViewController.h" 

@interface TextFieldController : NSObject <UITextFieldDelegate> 
{ 
} 
@property (nonatomic, assign) ViewController *viewController; 
@end 

然後改變你的TextFieldController。像這樣的M檔:

#import "TextFieldController.h" 

@interface TextFieldController() 

@end 

@implementation TextFieldController 

- (BOOL) textFieldShouldBeginEditing:(UITextField *)textField { 
    NSLog(@"hello"); 
    self.viewController.charactersLabel.text = @"hello"; 
    return YES; 
} 

@end 

在ViewController.m做這樣的:

#import "ViewController.h" 

@interface ViewController() 

@property (nonatomic, strong) TextFieldController *textFieldController; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    _textFieldController = [[TextFieldController alloc] init]; 
    _textFieldController.viewController = self; 
    _textField.delegate = _textFieldController; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

@end 

這將工作,但我個人不喜歡這樣,你拿了。 祝你好運:)

+0

謝謝,它的工作!你推薦我這樣做?我需要將代表和視圖控制器保存在不同的文件中。 – rene

+0

爲什麼你需要它在不同的文件? –

+0

所以我可以在不同的類中使用委託/數據源。 – rene

0

它失敗,因爲_viewController爲零。您需要在委託中分配viewController屬性以支持雙向通信。

另外,我強烈建議你讓委託對象成爲NSObject的一個子類,而不是UIViewController。它與控制視圖無關。你可以手動在你的ViewController對象viewDidLoad中實例化它。

0

在TextViewController中,我沒有看到viewController屬性(_viewController ivar)被設置的位置,因此它可能爲零。您應該在創建TextViewController實例時進行設置。

+0

我應該如何設置伊娃? – rene

0

當您使用storyboad的賽格瑞那麼你需要實現prepareForSegue方法來初始化其屬性如下

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([segue.identifier isEqualToString:@"segue for textFieldController"]) 
    { 
     TextFieldController *_textFieldController = [segue destinationViewController]; 
     _textField.delegate = _textFieldController; 
    } 
} 

但我想知道,你爲什麼要設置textFieldDelegate這裏,爲什麼不能導航到其他控制器你在TextFieldController的viewDidLoad方法中設置了那麼你沒有實現上面的prepareForSegue方法調用?

除了你保持對方的強烈參考,你正在創造強大的保留週期。

一兩件事,下面的代碼

_textField.delegate = _textFieldController; 

將無法​​正常工作,直到textFieldController加載其viewDidLoad方法被稱爲你只初始化,但其網點將不會連接到視圖裝入導航堆棧。