【问题标题】:iOS Updating ViewController UILabel from another ClassiOS 从另一个类更新 ViewController UILabel
【发布时间】:2023-03-27 20:26:02
【问题描述】:

我是开发新手,我一直在拼命想弄清楚这一点,我敢肯定,我错过了一些愚蠢的东西,但是在尝试了各种不同的解决方案之后,我仍然无法获得我正在寻找的结果。

我希望能够从另一个类更新 ViewController 中的 UILabel,这是一个我无法开始工作的小演示程序,我有一个 ViewController,它有两个 UILabel,一个是从 @987654321 更新的@ 和另一个我想从另一个名为 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

【问题讨论】:

    标签: ios iphone objective-c uiviewcontroller uilabel


    【解决方案1】:

    像这样在 newClass 中定义它

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

    并从您的 viewController 调用它

    [NewClass updatedisplay:self];
    

    【讨论】:

      【解决方案2】:

      首先,确保在NewClass 中初始化ViewController,然后你可以用它做任何你想做的事情。

      #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
      

      【讨论】:

      • 此方法对我不起作用,我收到“未知类型名称 aViewController”错误,我已更新 @property 语句以包含 aViewController 但它仍然出错。
      • 对不起,你应该使用_aViewController
      【解决方案3】:
      @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 在这里未初始化。但是,即使您随后分配并初始化它,您也不会获得要更新其视图的活动视图控制器,而只是另一个视图控制器实例。

      【讨论】:

      • 感谢您的信息,我已将它们更改为弱,并且与 Meth 的以下建议一起,它现在正在工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多