0

カスタム クラスからコードを実行して、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];
}

何か案は?

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 に答える