2016-04-03 24 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模式。 –

相關問題