Ios UITextField代理不工作
我试图将UITextViewDelegate方法与我的项目的主类分开,我创建了一个类来管理委托方法,但我无法更改主类中IBOulets的值 我用一个ViewController和一个TextFieldController做了一个测试项目,在故事板中我添加了一个文本字段和一个标签。我要做的是在开始在文本字段中写入时更改标签的文本。代码如下: ViewController.h:Ios UITextField代理不工作,ios,Ios,我试图将UITextViewDelegate方法与我的项目的主类分开,我创建了一个类来管理委托方法,但我无法更改主类中IBOulets的值 我用一个ViewController和一个TextFieldController做了一个测试项目,在故事板中我添加了一个文本字段和一个标签。我要做的是在开始在文本字段中写入时更改标签的文本。代码如下: ViewController.h: #import <UIKit/UIKit.h> #import "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
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?还是各种各样的?因为如果您有不同的类、不同的标签和名称,那么一个委托对您有什么帮助?