0

我是初学者 iPhone 开发人员。

我有2节课。TestViewController(这与情节提要中的视图相关联)和ViewController.

我试图调用一个方法([tc refresh:val];)作为类TestViewControllerval参数ViewController。我可以从val到达的日志中看到TestViewController,但由于某种原因,标签没有更新,我也没有得到我在视图中设置的标签的当前文本。它赋予null价值。请查看我得到的代码和日志,并建议我如何通过调用 from VCto的方法来更新标签TVC

测试视图控制器.h

#import <UIKit/UIKit.h>
#import "ViewController.h"

@interface TestViewController : UIViewController

@property (retain, nonatomic) IBOutlet UILabel *lblDisp;

- (IBAction)chngText:(id)sender;
- (void)refresh:(NSString *)val;

@end

测试视图控制器.m

#import "TestViewController.h"
#import "ViewController.h"

@implementation TestViewController
@synthesize lblDisp;
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"TEST VC LOADED");
    NSLog(@"TEXT CUrret VALUE SUPERVIEW %@",lblDisp.text);
}

- (IBAction)chngText:(id)sender {
    ViewController *dd=[[ViewController alloc]init];
    [dd display];
}

-(void)refresh:(NSString *)val{
    NSLog(@"Value of Val = %@",val);
    NSLog(@"TEXT CUrret VALUE %@",lblDisp.text);
    lblDisp.text=val;
}
@end

视图控制器.h

#import <UIKit/UIKit.h>
#import "TestViewController.h"

@interface ViewController : UIViewController

-(void)display;

@end

视图控制器.m

#import "ViewController.h"
#import "TestViewController.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"VC LOADED");
}

-(void)display{
    NSLog(@"Reached VC");
   NSString *val=@"1";
    TestViewController *tc=[[TestViewController alloc]init];
    [tc refresh:val];
}

@end

日志

2013-07-24 03:13:36.413 Simple test[38477:11303] TEST VC LOADED
2013-07-24 03:13:36.415 Simple test[38477:11303] TEXT CUrret VALUE SUPERVIEW sdfgdfgd
2013-07-24 03:13:37.909 Simple test[38477:11303] Reached VC
2013-07-24 03:13:37.910 Simple test[38477:11303] Value of Val = 1
2013-07-24 03:13:37.911 Simple test[38477:11303] TEXT CUrret VALUE (null)
4

2 回答 2

4

您的问题在于您将值传回的方式。

TestViewController *tc=[[TestViewController alloc]init];
[tc refresh:val];

第一行创建并初始化tc您的TestViewControllerClass 的新实例。这允许您访问它的方法,但这并不意味着您正在访问您最初创建的实例或您最初分配的数据。这意味着您的 labellblDisp以及新TestViewController实例的其他属性都为零。

基本上你不能使用这种策略来回传递数据。请参阅此 SO 帖子:

在视图控制器之间传递数据

于 2013-07-24T14:48:34.280 回答
2

问题很简单

  -(void)refresh:(NSString *)val{
        NSLog(@"Value of Val = %@",val);
        NSLog(@"TEXT CUrret VALUE %@",lblDisp.text);
        lblDisp.text=val;
    }

在这里打印日志后,值会被更新,所以像这样更改代码,首先更新标签,然后记录值

所以使用

  -(void)refresh:(NSString *)val{
        lblDisp.text=val;
        NSLog(@"Value of Val = %@",val);
        NSLog(@"TEXT CUrret VALUE %@",lblDisp.text);
    }

编辑

那么原因可能lblDisp是从 nib 加载,并且在视图呈现/推送之前它不是有效的内存。然后只有该方法将具有有效的标签实例,然后只有您可以更新它

于 2013-07-24T11:35:11.090 回答