Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么可以';此视图控制器是否设置下一个视图控制器的文本字段?_Iphone_Ios_Objective C - Fatal编程技术网

Iphone 为什么可以';此视图控制器是否设置下一个视图控制器的文本字段?

Iphone 为什么可以';此视图控制器是否设置下一个视图控制器的文本字段?,iphone,ios,objective-c,Iphone,Ios,Objective C,我有一个视图控制器,它有一个带有“完成”按钮的导航栏和两个文本字段。按下“完成”按钮时,将调用方法postInfo。以下是实施方案: - (void)postInfo{ ListingViewController* lvc = [[ListingViewController alloc] init]; NSString* listingName = listingNameField.text; NSString* listingPrice = listingPriceField.text;

我有一个视图控制器,它有一个带有“完成”按钮的导航栏和两个文本字段。按下“完成”按钮时,将调用方法
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
#导入
@界面列表ViewController:UIViewController
@属性(弱,非原子)IBUILabel*价格标签;
@性质(弱,非原子)IBUILabel*标题标签;
@结束
UILabel是通过xib文件设置的,为空。将根据要求发布任何其他需要的代码

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

您可能会发现此答案中的解释很有用:

如果在调用的行之后设置断点

testViewController*viewController=segue.destinationViewController

构建和运行项目时,您会发现UITextField 未分配destinationViewController中的属性,并且 已在断点处启动(内存为0x0)。与此同时,美国国家统计局(NSN)的数据线 属性已分配并初始化(因此您可以设置其 价值)


在执行该推送时,下一个控制器的视图尚未加载,因此您无法访问其视图。您需要在ListingViewController中创建NSString属性,并将字符串传递给PostInfo方法中的属性。然后在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属性之前,不会加载视图,并且所有子视图都为零。在正在推送的视图控制器上调用viewDidLoad后,可以配置它们。调用
[lvc view]
立即加载视图。

尝试这样做

首先,您需要加载视图(推送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]; 

}

这就成功了。我需要开始熟悉创建视图控制器的过程。谢谢!