我是初学者iPhone开发者。
我有2节课。 TestViewController
(这与故事板中的视图相关联)和ViewController
。
我尝试在[tc refresh:val];
中使用TestViewController
作为val
类的参数调用方法(ViewController
)。我可以从日志中看到val
到达TestViewController
,但由于某种原因,标签没有更新,我也没有得到我在视图中设置的标签的当前文本。它给出null
值。请查看代码和日志我得到并建议我如何通过调用从VC
到TVC
的方法来更新标签。
#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
#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
#import <UIKit/UIKit.h>
#import "TestViewController.h"
@interface ViewController : UIViewController
-(void)display;
@end
#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)
答案 0 :(得分:4)
你的问题在于你传回价值的方式。
TestViewController *tc=[[TestViewController alloc]init];
[tc refresh:val];
第一行创建并初始化tc
类的新实例TestViewController
。这允许您访问其方法,但这并不意味着您正在访问最初创建的实例或您最初分配的数据。这意味着您的标签lblDisp
以及新TestViewController
实例属性的其余部分均为零。
基本上你不能使用这种策略来回传递数据。见SO帖子:
答案 1 :(得分: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加载的,并且在显示/推送视图之前它不是有效的内存。然后只有方法才会有有效的标签实例,然后才能更新它