为什么这个视图控制器不能设置下一个视图控制器的文本字段?
我有一个视图控制器,有一个完成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];
}