我有一个视图控制器,其导航栏带有完成按钮和两个文本字段。按下完成按钮后,将调用方法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文件设置的,是空的。将根据要求发布任何其他代码。
答案 0 :(得分:1)
当您执行该操作时,尚未加载下一个控制器的视图,因此您无法访问其视图。您需要在ListingViewController中创建NSString属性,并将字符串传递给postnfo方法中的字符串。然后在ListingViewController的viewDidLoad方法中,使用这些属性来填充标签(这些标签将在viewDidLoad运行时加载)。
答案 1 :(得分:1)
将您的代码更改为此。
- (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]
会立即加载视图。
答案 2 :(得分:0)
我通常也会得到这个(在使用segues的例子中)。我在NSString
的{{1}}期间设置IBOutlet
属性而不是prepareForSegue
来解决这个问题。然后在下一个视图控制器的destinationController
期间,我获取属性的值并将其分配给viewDidLoad
。
您可能会发现此答案中的解释很有用:https://stackoverflow.com/a/8094146/2358334
如果您在调用的行之后设置断点
UILabel
当您构建并运行项目时,您会发现UITextField destinationViewController中的属性未分配和 在断点处启动(内存为0x0)。同时NSString 属性已经分配并初始化(所以你可以设置它 值)。
答案 3 :(得分:0)
尝试这样做
首先你需要加载视图(推送视图控制器)然后你可以访问属性(因为你已经通过 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];
}