UITextFieldDelegate不起作用

时间:2014-01-08 19:27:22

标签: ios

我正在尝试将UITextViewDelegate方法与项目的主类分开,我创建了一个用于管理委托方法的类,但我无法从主类更改IBOulets的值。

我使用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

Text Field 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”,但标签的文本不会更改。我想知道如何更改其他类的标签文本值。

4 个答案:

答案 0 :(得分:0)

它失败了,因为_viewController是零。您需要在委托中分配viewController属性,以支持双向通信。

另外,我强烈建议你让你的委托对象成为NSObject的子类,而不是UIViewController。它对控制视图没有任何作用。您可以在ViewController对象viewDidLoad中手动实例化它。

答案 1 :(得分:0)

在TextViewController中,我没有看到viewController属性(_viewController ivar)的设置位置,因此它可能为零。您应该在创建TextViewController实例时进行设置。

答案 2 :(得分:0)

当您使用storyboad的segue导航到其他控制器时,您需要实现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方法,因为您只是初始化它,但在将视图加载到导航堆栈之前,它的出口将不会连接。

答案 3 :(得分: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

这会有效,但我个人不喜欢你采取的方式。 祝你好运:)