在另一个类中设置textview的文本不起作用

时间:2013-09-22 20:07:28

标签: ios objective-c uiviewcontroller uitextview

使用故事板我设置了两个不同的视图控制器(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

4 个答案:

答案 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是该类的另一个实例。不一样。