为什么这个视图控制器不能设置下一个视图控制器的文本字段?

我有一个视图控制器,有一个完成button的导航栏,和两个文本字段。 当完成button被按下时, 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中创buildNSString属性,并将string传递给postnfo方法中的那些string。 然后在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]; } 

发生这种情况是因为直到访问视图控制器的视图属性,视图将不会被加载,所有的子视图都是零。 可以在viewDidLoad在被推送的视图控制器上被调用之后configuration它们。 调用[lvc view]立即加载视图。

我通常也会得到这个(在使用segues的例子中)。 我通过在destinationController prepareForSegue期间设置一个NSString属性而不是IBOutlet来解决这个问题。 然后,在下一个视图控制器的viewDidLoad期间,我将该属性的值分配给UILabel

您可能会在这个答案中find解释有用: https : //stackoverflow.com/a/8094146/2358334

如果你在你呼叫的那一行后面设置一个断点

testViewController *viewController = segue.destinationViewController;

当您构build并运行项目时,您会发现destinationViewController中的UITextField属性在断点处未分配和启动(内存为0x0)。 同时NSString属性已经被分配和初始化(所以你可以设置它的值)。

尝试做到这一点

首先你需要加载视图(push viewcontroller)然后你可以访问属性(因为你已经创build了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]; 

}