0

我试图在我的 viewController 中隐藏一个对象,代码从自定义类执行,但该对象为零。

第一视图控制器.h

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController {
    IBOutlet UILabel *testLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *testLabel;

- (void) hideLabel;

FirstViewController.m 我合成了 testLabel,我有一个隐藏它的功能。如果我从 viewDidAppear 调用该函数,它可以工作,但我想从我的其他类调用它。当从其他类调用时,testLabel 为 nil

#import "FirstViewController.h"
#import "OtherClass.h"

@implementation FirstViewController
@synthesize testLabel;

- (void) hideLabel {
    self.testLabel.hidden=YES;
    NSLog(@"nil %d",(testLabel==nil)); //here I get nil 1 when called from OtherClass
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    OtherClass *otherClass = [[OtherClass alloc] init];
    [otherClass hideThem];
    //[self hideLabel]; //this works, it gets hidden
}

其他类.h

@class FirstViewController;

#import <Foundation/Foundation.h>

@interface OtherClass : NSObject {
    FirstViewController *firstViewController;
}

@property (nonatomic, retain) FirstViewController *firstViewController;

-(void)hideThem;

@end

OtherClass.m 调用 FirstViewController 中的 hideLabel 函数。在我的原始项目中,(这显然是一个例子,但原始项目正在工作)我在这里下载了一些数据,我想在下载完成后隐藏我的加载标签和指示器

#import "OtherClass.h"
#import "FirstViewController.h"

@implementation OtherClass
@synthesize firstViewController;

-(void)hideThem {
    firstViewController = [[FirstViewController alloc] init];
    //[firstViewController.testLabel setHidden:YES]; //it doesn't work either
    [firstViewController hideLabel];
}

有任何想法吗?

4

1 回答 1

0

UILabel是 nil 因为你刚刚初始化了你的控制器但没有加载它的视图。当您第一次请求访问绑定视图时,控制器的 IBoutlets 会自动从 xib 或情节提要中实例化,因此为了访问它们,您首先必须通过某种方式加载其视图。

编辑(在OP评论之后):

由于您FirstViewController已经初始化并且您OtherClass已由该控制器实例化,因此您可以只保留对它的引用而不尝试初始化新的。所以尝试这样的事情:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    OtherClass *otherClass = [[OtherClass alloc] init];
    otherClass.firstViewController = self;
    [otherClass hideThem];
}

在您的OtherClass.m 中

-(void)hideThem {
    [self.firstViewController hideLabel];
}
于 2012-05-26T07:11:19.487 回答