【问题标题】:Putting text input from one view to another将文本输入从一个视图放到另一个视图
【发布时间】:2025-11-23 07:10:01
【问题描述】:

我尝试了很多教程,我想知道为什么我没有遇到这么简单的问题。我有一个名为 SetBudgetViewController 的视图控制器。我在此视图中有一个文本字段,我已将其连接为一个名为 *amountToSpend 的插座。我在应用程序的其他地方使用了另一个视图,它有一个名为 *amountSet 的标签。如何使输入到第一个文本字段中的数字显示在另一个视图的标签中?非常感谢你们(这让我发疯)!

【问题讨论】:

    标签: iphone ios uiviewcontroller uilabel transfer


    【解决方案1】:

    首先,在另一个视图控制器中声明一个属性:

    @property (strong, nonatomic) NSString *amountToSpend;
    

    在 SetBudgetViewController 中,在您的 -(void)prepareForSegue 方法中:

    if([segue.identifier isEqualToString:@"YourIdentifier"])
    {
        OtherViewController *vc = segue.destinationViewController;
        vc.amountToSpend = self.amountToSpend.text;
    }
    

    在另一个视图控制器中,在 viewDidLoad 中显示数量。

    self.amountSet.text = self.amountToSpend;
    

    编辑 2: 在彼此不接近的 VC 之间传递数据的替代方案。您可以重复上述操作或使用 NSUserDefaults。

    在SetBudgetViewController中输入金额后:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:self.amountToSpend.text forKey:@"AmountToSpend"];
    [defaults synchronize];
    

    在另一个视图控制器中,在 viewDidLoad 中显示数量。

    self.amountSet.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"AmountToSpend"];
    

    【讨论】:

    • 感谢您的回复。不幸的是,我得到了另一个视图控制器在 SetBudgetVC 中未知的错误。我导入了 .h 文件,但没有运气。这两个视图并不相邻。 EditBudgetVC(这是另一个 vc)通过来自故事板中另一个视图控制器的模态序列显示。有什么想法吗?
    • 我建议您使用一些图表来解释您刚才提到的内容。此外,您是否将 amountToSpend 值保存在核心数据或用户默认值中以供将来使用?
    • 我没有将 amountToSpend 保存在核心数据或用户默认值中(我什至不知道那是什么)。我解释的不清楚(我的错)。基本上,我们所说的OtherViewController 称为EditBudgetViewController。 SetBudgetViewController 和 EditBudgetViewController 之间没有segue。 EditBudgetViewController 在应用程序的层次结构中很深。希望这一点得到澄清。
    • 如果是这样,我建议你阅读 NSUserDefaults。这是解决问题的最简单方法。
    • 好的,瑞克。非常感谢你的帮助。看起来其他一些回答者解释了 NSUserDefaults,所以我会尝试理解它。
    【解决方案2】:

    我希望这对你有用 首先查看在哪里设置用户默认值

    .h 文件

    @property(nonatomic,retain) IBOutlet UITextField *txtfield;
    

    在 .m 文件中

      @synthesize txtfield;
    

    现在点击按钮

      NSString * text = txtfield.text;
     [NSUserDefault StandardUserDefault] setValue : text forKey : @"textfieldtext"];
    

    根据需要推送您的视图或呈现模式

    然后在下一个视图中写如下

    label.text = [NSUserDefaults standardUserDefault]valueForKey :@"textfieldtext"];
    

    【讨论】:

    • 感谢您的回复。在哪里设置文本字段的名称以便代码可以识别?
    • 您必须设置文本字段的出口才能识别它,例如。 .h 文件 IBOutlet UITextField *txtfield;并从 xib 文件中加入出口
    • 不走运。它说它无法识别 StandardUserDefault。
    • 应该是“standardUserDefaults”...(注意小写和's')
    【解决方案3】:

    由于你有很多教程,我猜你编码足够但不熟悉概念..

    首先,由于这两个控件位于不同的视图控制器中,这意味着您必须在它们之间建立连接以帮助标签找出您在文本输入中输入的内容。 连接可以是委托、通知或 plist 值,所以你会在这里找到很多解决方案。

    对于你提到的这种情况,我建议使用委托解决方案。 既然您有教程,请尝试找到委托部分并了解委托做什么以及为什么。

    【讨论】:

    • 您能具体解释一下代表是什么吗?我进行了研究,但在理解这个概念时遇到了一些困难。
    【解决方案4】:

    首先,您需要一种方法来了解用户何时在您的第一个文本视图中输入了内容。一种方法是实现 UITextField 委托并覆盖 textFieldDidBeginEditing 方法。

    接下来,您需要获取输入的数据并将其发送到第二个 textView。一个简单的方法是使用 NSNotificationCenter。在你的第一个视图控制器中像这样使用它:

    -(void) textFieldDidBeginEditing:(UITextField *)textField {
    
        NSArray* objects = [[NSArray alloc] initWithObjects:[textField text], nil];
        NSArray* keys = [[NSArray alloc] initWithObjects:@"text", nil];
        NSDictionary* dict =[[NSDictionary alloc] initWithObjects:objects forKeys:keys];
    
        [[NSNotificationCenter defaultCenter] postNotificationName:@"firstTextFieldEditted" object:nil userInfo:dict];
    }
    

    在您的其他视图控制器上,您需要将其添加到您的 init 方法中:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(modifySecondTextField:) name:@"firstTextFieldEditted" object:nil];
    

    并创建以下方法:

    - (void)modifySecondTextField:(NSNotification*) notification {
    
        NSString* text = [dict objectForKey:@"text"];
    
        // TODO - update your textfield here
    
    }
    

    如果您需要区分通知的发送者,只需这样做

    [[NSNotificationCenter defaultCenter] postNotificationName:@"firstTextFieldEditted" object:textField userInfo:dict]; -- notice object:textField. You can then differentiate them by their tag for example.
    

    这样你就可以参考你的初始文本字段 我希望这能让你很好地了解 NSNotificationCenter 的工作原理。祝你好运。

    【讨论】:

    • 在另一个视图中更新标签似乎有点复杂。要在同一个视图中更新标签,您只需要拥有self.textField.text = self.labelWithText.text,因此您需要所有这些来更新另一个视图中的标签似乎令人困惑。不过感谢您的帮助。我会调查 NSNotificationCenter。
    • 我知道问题在于更新文本字段,一个在视图控制器上,另一个在另一个视图上。然后,如果你想避免在视图中保留对视图控制器的引用,你可以这样做。
    • 啊,我明白了。感谢您的帮助。