0

我有一个视图控制器,它具有带完成按钮的导航栏和两个文本字段。当按下完成按钮时,该方法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 文件设置的,并且是空的。将根据要求发布任何其他代码。

4

4 回答 4

1

在您进行推送时,下一个控制器的视图尚未加载,因此您无法访问其视图。您需要在 ListingViewController 中创建 NSString 属性并将字符串传递给您的 postnfo 方法中的那些。然后在 ListingViewController 的 viewDidLoad 方法中,使用这些属性来填充标签(在 viewDidLoad 运行时已经加载)。

于 2013-07-20T20:44:34.100 回答
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]; 
}

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

于 2013-07-20T20:47:47.910 回答
0

我通常也会得到这个(在使用 segues 的例子中)。我通过设置NSString属性IBOutletprepareForSegue不是destinationController. 然后viewDidLoad在下一个 View Controller 期间,我获取属性的值并将其分配给UILabel.

您可能会发现此答案中的解释很有用:https ://stackoverflow.com/a/8094146/2358334

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

testViewController *viewController = segue.destinationViewController;

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

于 2013-07-20T20:38:35.107 回答
0

尝试这样做

首先你需要加载视图(push 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]; 

}

于 2013-07-20T20:49:50.040 回答