【问题标题】:Why is my variable null when I am attempting to access it from another view controller (Objective-c?当我尝试从另一个视图控制器(Objective-c?
【发布时间】:2015-11-18 19:15:16
【问题描述】:

我正在尝试在我的第二个视图控制器中的另一个 UITextField 的另一个 .text 中使用我的第一个视图控制器中的 UITextField 的 .text,但我的第一个视图控制器 firstTField.text 在我的第二个视图控制器中结果为(null)即使我在我的第一个视图控制器中打印了 _firstTField.text 并且它打印了输入的输入。

可能是什么问题?为什么为空? 有人可以指导我如何处理/解决这个问题吗?

FirstViewController.h

@property (weak, nonatomic) IBOutlet UITextField *firstTField;

SecondViewController.h

@property (weak, nonatomic) IBOutlet UITextField *secondTField;

SecondViewController.m

#import "FirstViewController.h"

- (void)viewDidLoad {
     [super viewDidLoad];
     FirstViewController *firstPage = [[FirstViewController alloc] init];
     _secondTField.text = firstPage.firstTField.text;
}

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    我将假设FirstViewController 转为SecondViewController。您的代码有两件事会阻止 secondTField 设置其文本:

    1) 您正在实例化 FirstViewControllernew 实例,而不是引用您从中分离的实例。这个新的FirstViewController 将不在视图层次结构中,因此不会设置其文本字段。

    2) 您需要在 segue 期间使用 NSString 将该信息暂时保存在 SecondViewController 中,同时将其加载到视图层次结构中。

    您的代码将如下所示:

    FirstViewController.h

    @property (weak, nonatomic) IBOutlet UITextField *firstTField;
    

    SecondViewController.h

    @property (weak, nonatomic) IBOutlet UITextField *secondTField;
    @property (strong, nonatomic) NSString *secondTFieldText;  // temporary to hold the text from FirstViewController
    

    FirstViewController.m

    #import "SecondViewController.h"
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        SecondViewController *secondViewController = (SecondViewController *)segue.destinationViewController;
        secondViewController.secondTFieldText = self.firstTField.text;
    }
    

    SecondViewController.m

    #import "FirstViewController.h"
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.secondTField.text = self.secondTFieldText;
    }
    

    【讨论】:

    • 我正在使用以下代码从 FirstViewController 到 SecondViewController [self performSegueWithIdentifier:@"goSecondVC" sender:self]; .我如何使用您提供的 prepareForSegue 相应地对其进行修改?谢谢!
    • prepareForSegueUIViewController 的一种方法,我在示例中覆盖了它。当你调用performSegueWithIdentifier 时,它会调用prepareForSegue 然后执行segue。因此,您需要做的就是添加 prepareForSegue 方法,就像我在示例中所做的那样。
    【解决方案2】:

    希望对你有帮助

    标有 IBOutlets 的属性在视图控制器的视图加载并呈现给用户时分配。

    所以在你以某种方式显示你的视图控制器之前它是空的。

    在这段代码中,你还没有将 firstPage 的视图添加到任何地方,所以它返回 null。

    - (void)viewDidLoad {
         [super viewDidLoad];
         FirstViewController *firstPage = [[FirstViewController alloc] init];
         _secondTField.text = firstPage.firstTField.text;
    }
    

    【讨论】:

    • 你能给我看一个例子吗?不要安静地理解它的含义。
    【解决方案3】:

    您的 firstViewController 的 IBOutlets 尚未初始化。创建一个字符串属性。设置那个。然后在您的 firstViewController 的 viewDidLoad 中设置 textField 的 text 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      相关资源
      最近更新 更多