2016-04-03 52 views
1

我想从视图控制器1传的UITextField文本到的UILabel在视图控制器2传递的UITextField文本的UILabel不同的视图控制器

我使用SEGUE传递信息,但我没有得到任何东西在标签上。这似乎是从文本字段中的文本变为NULL当它被传递给查看控制器2

视图控制器1(的UITextField)

- (IBAction)sendtoVC2:(UIButton *)sender 
{ 
    [self performSegueWithIdentifier:@"toVC2" sender:self]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"toVC2"]) 
    { 
     ViewController2 *VC2 = (ViewController2 *)segue.destinationViewController; 
     VC2.label.text = self.textField.text; 
    } 
} 

视图控制器2.H(的UILabel)

#import "ViewController1.h" 

@interface ViewController2 : UIViewController 
@property (strong, nonatomic) IBOutlet UILabel *label; 
@end 

谢谢。

回答

2

最有可能的是,它发生的原因是标签不存在。当UIViewController被创建时,它的视图不会被加载,直到它实际需要。这被称为“延迟加载”,这意味着仅当有人第一次需要时才创建一个值。

延迟加载是在计算机编程 常用推迟对象的初始化,直到它是需要 点的设计模式。如果 正确且适当地使用,它可以有助于提高程序的运行效率。

第二个视图控制器中的UILabel属性只有在加载了第二个视图控制器的视图后才会获取值,只有当有人显式调用其'view'属性时才会发生这种情况。所以,为了证明我的说法只是插入一个多行:

if ([segue.identifier isEqualToString:@"toVC2"]) 
{ 
    ViewController2 *VC2 = (ViewController2 *)segue.destinationViewController; 
    UIView *unusedReferenceToViewToLoadTheView = VC2.view 
    VC2.label.text = self.textField.text; 
} 
+0

你太棒了!有效!但是,我怎样才能删除这个未使用的变量警告? – OHHO

+0

如果我没有记错,那么在变量之前放置__unused会使您的警告消失,如'__unused UIView * unusedReferenceToViewToLoadTheView = VC2.view' – xinatanil

+0

很好用,谢谢 – OHHO

2

在视图控制器2的viewDidLoad中,文本丢失,因为标签还没有建立。

您必须将文本保存在变量中,并在ViewController2的viewDidLoad中将文本设置为标签。

像这样:

视图控制器1:

- (IBAction)sendtoVC2:(UIButton *)sender 
{ 
    [self performSegueWithIdentifier:@"toVC2" sender:self]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"toVC2"]) 
    { 
     ViewController2 *VC2 = (ViewController2 *)segue.destinationViewController; 
     VC2.text = self.textField.text; 
    } 
} 

视图控制器·H:

#import "ViewController1.h" 

@interface ViewController2 : UIViewController 
@property (strong, nonatomic) IBOutlet UILabel *label; 
@property (nonatomic, copy) NSString *text; 
@end 

视图控制器2.M:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    label.text = text; 
} 
+0

你的答案也可以,但我必须使用@xinatanil答案,因为我不需要创建不必要的'NSString's。虽然答案很好。 – OHHO

+1

最好在第二个vc中添加一个NSString变量并为其分配文本。并且鉴于第二个VC的负载分配了文本变量来标记。因为不建议从VC1直接修改其他视图控制器的视图(VC2)。它违背了MVC模式。 –

相关问题