使用故事板我设置了两个不同的视图控制器(A& B),其中一个(B)有一个UITextView。
如何从View Controller A访问和更改textview中的文本?
下面的代码没有给出任何错误,但是未设置文本,即使正确调用了该函数。
如果我在ViewControllerB的viewDidLoad中运行[self.desc setText:text];
,它就可以工作。
ViewControllerA.h
@interface ViewControllerA : UIViewController
{
}
@end
ViewControllerA.m
#import "ViewControllerA.h"
#import "ViewControllerB.h"
@interface ViewControllerA ()
@end
@implementation ViewControllerA
- (void)viewDidLoad
{
[super viewDidLoad];
ViewControllerB *bInstance = [[ViewControllerB alloc] init];
[bInstance setDescription:@"this is some new text";
}
@end
ViewControllerB.h
@interface ViewControllerB : UIViewController
{
UITextView *desc;
}
- (void)setDescription:(NSString *) text;
@property (nonatomic, retain) IBOutlet UITextView *desc;
@end
ViewControllerB.m
#import "ViewControllerB.h"
@interface ViewControllerB ()
@end
@implementation ViewControllerB
@synthesize desc;
- (void)setDescription:(NSString *)text{
NSLog(@"called!");
[self.desc setText:text];
}
@end
答案 0 :(得分:3)
您不应该操纵另一个视图控制器的视图。一般来说这是糟糕的设计,通常根本不起作用(正如你所发现的那样)。
而是在第二个视图控制器中设置字符串属性。设置(在prepareForSegue中,如果你正在使用故事板。)
然后,在第二个视图控制器的viewWillAppear中,将字符串放入文本字段。
答案 1 :(得分:0)
执行以下操作:
@interface ViewControllerA : UIViewController
{
UITextView *desc;
@public
ViewControllerB objB;
}
发布时:
ObjectOfAToLaunch.objB = ObjectOfBToLaunch;
在视图中加载
- (void)viewDidLoad
{
[super viewDidLoad];
[Objb setDescription:@"this is some new text"];
}
祝你好运。
答案 2 :(得分:0)
您可以在启动A和B的控制器中实现prepareForSegue方法。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Make sure your segue name in storyboard is the same as this line
if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
{
// Get reference to the destination view controller
UIViewController *vc = [segue destinationViewController];
if ([vc isKindOfClass:ViewControllerB])
{
ObjB = vc; // ObjB is a public member you must declare in interface
if (ObjA!=nil)vc->ObjA = ObjB;
}
if ([vc isKindOfClass:ViewControllerA])
{
ObjA = vc; // ObjA is a public member you must declare in interface
if (ObjB!=nil)vc->ObjA = ObjB;
}
}
}
祝你好运。
答案 3 :(得分:0)
bInstance是该类的另一个实例。不一样。