【问题标题】:Why can't this view controller set the text fields of the next view controller?为什么这个视图控制器不能设置下一个视图控制器的文本字段?
【发布时间】:2013-07-20 20:32:56
【问题描述】:

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

【问题讨论】:

    标签: iphone ios objective-c


    【解决方案1】:

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

    【讨论】:

    • 这成功了。我需要开始熟悉创建视图控制器的过程。谢谢!
    【解决方案2】:

    把你的代码改成这个。

    - (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] 会立即加载视图。

    【讨论】:

      【解决方案3】:

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

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

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

      testViewController *viewController = segue.destinationViewController;

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

      【讨论】:

        【解决方案4】:

        尝试这样做

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

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多