0

使用情节提要,我设置了两个不同的视图控制器 (A&B),其中一个 (B) 具有 UITextView。

如何从 View Controller A 访问和更改 textview 中的文本?


下面的代码没有给出任何错误,但没有设置文本,即使该函数被正确调用。

如果我[self.desc setText:text];在 ViewControllerB 的 viewDidLoad 内运行,它可以工作。

ViewControllerA.h

@interface ViewControllerA : UIViewController
{
}

@end

视图控制器A.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

视图控制器B.h

@interface ViewControllerB : UIViewController
{
    UITextView *desc;
}
- (void)setDescription:(NSString *) text;
@property (nonatomic, retain) IBOutlet UITextView *desc;
@end

视图控制器B.m

#import "ViewControllerB.h"

@interface ViewControllerB ()

@end

@implementation ViewControllerB
@synthesize desc;

- (void)setDescription:(NSString *)text{
    NSLog(@"called!");
    [self.desc setText:text];
}

@end
4

4 回答 4

3

你永远不应该操纵另一个视图控制器的视图。一般来说,这是一个糟糕的设计,而且通常根本不起作用(正如你所发现的那样。)

相反,在您的第二个视图控制器中设置一个字符串属性。设置它(在 prepareForSegue 中,如果您使用故事板。)

然后,在您的第二个视图控制器的 viewWillAppear 中,将字符串放入文本字​​段。

于 2013-09-22T23:46:55.253 回答
0

请执行下列操作:

@interface ViewControllerA : UIViewController
{
    UITextView *desc;
@public
    ViewControllerB objB;
}

启动时:

ObjectOfAToLaunch.objB = ObjectOfBToLaunch;

鉴于确实加载

- (void)viewDidLoad
{
   [super viewDidLoad];
   [Objb setDescription:@"this is some new text"];
}

祝你好运。

于 2013-09-22T20:18:23.427 回答
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;
        }
    }
}

祝你好运。

于 2013-09-22T20:38:05.780 回答
0

bInstance 是该类的另一个实例。不是同一个。

于 2013-09-23T14:06:42.253 回答