5

私は開発に不慣れで、これを理解しようとして壁に頭をぶつけています。確かに、私は何か愚かなことを見逃していると思いますが、さまざまな異なる解決策を試した後でも、結果を得ることができません。 m探しています。

別のクラスからViewControllerのUILabelを更新できるようにしたいのですが、これは動作させることができない小さなデモプログラムです。2つのUILabelを持つViewControllerがあり、1つはから更新されviewDidDoad、もう1つはIから呼び出されるNewClassと呼ばれる他のクラスから更新したいViewControllerのですが、コンソールがエントリをログに記録しているため、クラスが正しく呼び出されていることがわかりNSLogますが、を更新するための構文を取得できませんUILabel

前もって感謝します。

ViewController.h

 #import <UIKit/UIKit.h>

 @interface ViewController : UIViewController {

   UILabel *_labelupdate01;
   UILabel *_labelupdate02;     
 }

 @property (nonatomic, retain) IBOutlet UILabel *labelupdate01;
 @property (nonatomic, retain) IBOutlet UILabel *labelupdate02;

 @end

ViewController.m

#import "ViewController.h"
#import "NewClass.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize labelupdate01;
@synthesize labelupdate02;


- (void)viewDidLoad
{
    [super viewDidLoad];

    labelupdate01.text = @"Update from ViewController";

    [NewClass updatedisplay];
}
@end

NewClass.h

#import <Foundation/Foundation.h>

@class ViewController;

@interface NewClass : NSObject

@property (nonatomic, assign) ViewController *ViewController;

+ (void)updatedisplay;

@end

NewClass.m

 #import "NewClass.h"
 #import "ViewController.h"

 @implementation NewClass

 @synthesize ViewController = _ViewController;

 + (void)updatedisplay
 {
     NSLog(@"NewClass - updatedisplay");
     ViewController *labelupdate02;
     labelupdate02.labelupdate02.text = @"Update from NewClass";
 }

 @end
4

3 に答える 3

4

このようにnewClassでこれを定義します

+ (void)updatedisplay:(ViewController *)vc
{
     vc.labelupdate02.text=@"Update from NewClass";

}

viewControllerから呼び出します

[NewClass updatedisplay:self];
于 2013-03-24T22:45:27.143 に答える
1

まず、で初期化することを確認してくださいViewControllerNewClassそうすれば、それを使って好きなことを行うことができます。

#import <Foundation/Foundation.h>

@class ViewController;

@interface NewClass : NSObject

@property (nonatomic, assign) ViewController *aViewController;

+ (void)updatedisplay;

@end

実装中

 #import "NewClass.h"
 #import "ViewController.h"

 @implementation NewClass

 + (void)updatedisplay
 {

 _aViewController.labelupdate02.text = @"Update from NewClass";

 }

 @end
于 2013-03-24T22:40:37.097 に答える
0
@property (nonatomic, retain) IBOutlet UILabel *labelupdate01;
@property (nonatomic, retain) IBOutlet UILabel *labelupdate02;

@property (nonatomic, assign) ViewController *aViewController;

さて、これらのプロパティを(非アトミック、ウィーク)に変更することから始めます。これはより正しいアプローチです。また、MVCパターンでモデルクラスの1つから表示を更新することはお勧めできません。ですから、あなたのロジックは+ (void)updatedisplay私には意味がありません。それは+(NSString *) getStringToDisplay、関数に含まれる機能のようなものでなければならないと思います。名前とラベルのテキストは、受信した文字列に基づいてvcコードで更新されます。

しかし、あなたが尋ねた方法であなたの質問に答えるためだけに:

正しい方法は、methが提案したようにそれを行うか、初期化中にviewcontrollerをnewclassインスタンスに渡して、特定のviewcontrollerがすでに初期化されているようにすることです。

ほとんどのオブジェクトと同様に、次の手順を実行しても、現在アクティブなビューコントローラを取得できません。

 ViewController *labelupdate02;
 labelupdate02.labelupdate02.text = @"Update from NewClass";

labelupdate02はここでは初期化されていません。ただし、後で割り当てて初期化したとしても、ビューを更新するアクティブなビューコントローラーを取得するのではなく、別のビューコントローラーインスタンスを取得するだけです。

于 2013-03-24T22:50:31.930 に答える