我试图将UITextViewDelegate方法从我的项目的主类中分离出来,我创建了一个类来管理委托方法,但是我不能从主类中更改IBOulets的值。
我用一个ViewController和一个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视图控制器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];
}
@endTextFieldController.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“,但是标签的文本不会改变。我想知道如何从另一个类更改label文本值。
发布于 2014-01-08 20:30:59
首先更改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这是可行的,但我个人不喜欢你这样做。祝你好运:)
发布于 2014-01-08 19:32:23
它失败了,因为_viewController是零。为了支持双向通信,您需要在委托中分配viewController属性。
此外,我强烈建议您将委托对象作为NSObject的子类,而不是UIViewController的子类。它对控制视图没有任何作用。您可以在ViewController对象viewDidLoad中手动实例化它。
发布于 2014-01-08 19:32:43
在TextViewController中,我看不到viewController属性(_viewController ivar)是在哪里设置的,所以它可能是零。您应该在创建TextViewController实例时设置它。
https://stackoverflow.com/questions/21004761
复制相似问题