Ios UITextField代理不工作

Ios UITextField代理不工作,ios,Ios,我试图将UITextViewDelegate方法与我的项目的主类分开,我创建了一个类来管理委托方法,但我无法更改主类中IBOulets的值 我用一个ViewController和一个TextFieldController做了一个测试项目,在故事板中我添加了一个文本字段和一个标签。我要做的是在开始在文本字段中写入时更改标签的文本。代码如下: ViewController.h: #import <UIKit/UIKit.h> #import "TextFieldController.h"

我试图将UITextViewDelegate方法与我的项目的主类分开,我创建了一个类来管理委托方法,但我无法更改主类中IBOulets的值

我用一个ViewController和一个TextFieldController做了一个测试项目,在故事板中我添加了一个文本字段和一个标签。我要做的是在开始在文本字段中写入时更改标签的文本。代码如下:

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
#import <UIKit/UIKit.h>
#import "ViewController.h"

@interface TextFieldController : UIViewController <UITextFieldDelegate>

@end
TextFieldController.h:

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

@interface ViewController : UIViewController

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

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

@interface TextFieldController : UIViewController <UITextFieldDelegate>

@end

当我开始在文本字段中写入时,日志中会打印消息“Hello”,但标签的文本不会更改。我想知道如何更改另一个类的标签文本值。

它失败,因为_viewController为nil。您需要在代理中指定viewController属性,以支持双向通信


另外,我强烈建议您将委托对象设置为NSObject的子类,而不是UIViewController。它与控制视图无关。您可以在ViewController对象ViewDiLoad中手动实例化它。

在TextViewController中,我看不到ViewController属性(_ViewControllerIVAR)的设置位置,因此它可能为零。您应该在创建TextViewController实例时设置它。

当您使用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方法,否则将不起作用,因为您只是对其进行初始化,但在将视图加载到导航堆栈中之前,其出口将不会连接。

首先更改textFieldController。h如下所示:

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

@interface TextFieldController : NSObject <UITextFieldDelegate>
{
}
@property (nonatomic, assign) ViewController *viewController;
@end
#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
这会管用的,但我个人不喜欢你这样做。
祝你好运:)

我应该如何设置ivar?谢谢,它成功了!你建议我怎么做?我需要将委托和视图控制器保存在不同的文件中。为什么需要将其保存在不同的文件中?以便我可以在不同的类中使用委托/数据源。其他类的类型为ViewController?还是各种各样的?因为如果您有不同的类、不同的标签和名称,那么一个委托对您有什么帮助?