5

我是开发新手,一直在努力解决这个问题,我敢肯定,我错过了一些愚蠢的东西,但是在尝试了各种不同的解决方案之后,我仍然无法得到结果米找。

我希望能够从另一个类更新 ViewController 中的 UILabel,这是一个我无法开始工作的小演示程序,我有一个 ViewController,它有两个 UILabel,一个是用另一个更新的,viewDidDoad另一个是我想从另一个名为 NewClass 的类中更新ViewController,我可以看到该类被正确调用,因为控制台正在记录NSLog条目,但我无法获得更新UILabel.

提前致谢。

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

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

新类.h

#import <Foundation/Foundation.h>

@class ViewController;

@interface NewClass : NSObject

@property (nonatomic, assign) ViewController *ViewController;

+ (void)updatedisplay;

@end

新类.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;

好吧,首先将这些属性更改为 (nonatomic, weak) 。这是更正确的做法。从 MVC 模式中的模型类中更新显示并不是一个好习惯。所以你的逻辑+ (void)updatedisplay对我来说没有意义,我认为它应该类似于+(NSString *) getStringToDisplay函数中隐含的功能。名称和标签的文本根据接收到的字符串在 vc 代码中更新。

但只是以您提出的方式回答您的问题:

正确的方法是按照方法建议或在初始化期间将视图控制器传递给您的新类实例,以便您的特定视图控制器已经初始化。

与大多数对象一样,您不会通过以下方式获得当前活动的视图控制器:

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

labelupdate02 在这里未初始化。但是,即使您随后分配并初始化它,您也不会获得要更新其视图的活动视图控制器,而只是另一个视图控制器实例。

于 2013-03-24T22:50:31.930 回答