我正在尝试将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”,但标签的文本不会更改。我想知道如何更改其他类的标签文本值。
答案 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
这会有效,但我个人不喜欢你采取的方式。 祝你好运:)