从另一个类隐藏一个对象

时间:2012-05-26 06:55:09

标签: xcode

我正在尝试隐藏viewController中的对象,代码是从自定义类执行的,但对象是nil。

FirstViewController.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
}

OtherClass.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];
}

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

编辑(在OP评论之后):

由于您的FirstViewController已经初始化并且您的OtherClass已由该控制器实例化,因此您可以只保留对它的引用,而不是尝试初始化新的- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; OtherClass *otherClass = [[OtherClass alloc] init]; otherClass.firstViewController = self; [otherClass hideThem]; } 。 所以尝试这样的事情:

-(void)hideThem {
    [self.firstViewController hideLabel];
}

OtherClass.m

{{1}}