簡體   English   中英

為什么這個視圖控制器不能設置下一個視圖控制器的文本字段?

[英]Why can't this view controller set the text fields of the next view controller?

我有一個視圖控制器,其導航欄帶有完成按鈕和兩個文本字段。 按下完成按鈕后,將調用postInfo方法。 這是實施:

- (void)postInfo{
ListingViewController* lvc = [[ListingViewController alloc] init];

NSString* listingName = listingNameField.text;
NSString* listingPrice = listingPriceField.text;

NSLog(@"%@", listingName);
NSLog(@"%@", listingPrice); 

[lvc.titleLabel setText:listingName];
[lvc.priceLabel setText:listingPrice];

[self.navigationController pushViewController:lvc animated:YES]; 

}

這里的ListingViewController.h

#import <UIKit/UIKit.h>

@interface ListingViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;

@end

UILabel是通過xib文件設置的,是空的。 將根據要求發布任何其他代碼。

在您執行該操作時,尚未加載下一個控制器的視圖,因此您無法訪問其視圖。 您需要在ListingViewController中創建NSString屬性,並將字符串傳遞給postnfo方法中的字符串。 然后在ListingViewController的viewDidLoad方法中,使用這些屬性來填充標簽(這些標簽將在viewDidLoad運行時加載)。

將您的代碼更改為此。

- (void)postInfo
{
  ListingViewController* lvc = [[ListingViewController alloc] init];
  [lvc view];    // loads the view 

  NSString* listingName = listingNameField.text;
  NSString* listingPrice = listingPriceField.text;

  NSLog(@"%@", listingName);
  NSLog(@"%@", listingPrice); 

  [lvc.titleLabel setText:listingName];
  [lvc.priceLabel setText:listingPrice];

  [self.navigationController pushViewController:lvc animated:YES]; 
}

發生這種情況是因為在訪問視圖控制器的view屬性之前,將不會加載視圖並且所有子視圖都是nil。 可以在推送視圖控制器上調用viewDidLoad后配置它們。 調用[lvc view]會立即加載視圖。

我通常也會得到這個(在使用segues的例子中)。 我通過在destinationController prepareForSegue期間設置NSString屬性而不是IBOutlet來解決它。 然后在下一個View Controller的viewDidLoad中,我獲取屬性的值並將其分配給UILabel

您可能會發現此答案中的解釋很有用: https//stackoverflow.com/a/8094146/2358334

如果在您調用的行之后設置斷點

testViewController *viewController = segue.destinationViewController;

在構建和運行項目時,您會發現destinationViewController中的UITextField屬性未在斷點處分配和啟動(內存為0x0)。 同時NSString屬性已經分配並初始化(因此您可以設置其值)。

試着這樣做

首先你需要加載視圖(推送viewcontroller),然后你可以訪問屬性(因為你已經通過IBOutlet創建了視圖

- (void)postInfo{
    ListingViewController* lvc = [[ListingViewController alloc] init];

    NSString* listingName = listingNameField.text;
    NSString* listingPrice = listingPriceField.text;

    NSLog(@"%@", listingName);
    NSLog(@"%@", listingPrice); 

    [self.navigationController pushViewController:lvc animated:YES];

    [lvc.titleLabel setText:listingName];
    [lvc.priceLabel setText:listingPrice]; 

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM