如何从 View 获取数据到 UITabBarController

Posted

技术标签:

【中文标题】如何从 View 获取数据到 UITabBarController【英文标题】:How get data from View to UITabBarController 【发布时间】:2014-04-03 09:05:36 【问题描述】:

我有一个UITabBarController,其中有3 UIViewControllers。每个控制器都有几个UITextFields。在UItabBarController 中是一个“保存”按钮。请问,如何在UIViewControllores 中从UITextFields 获取数据?我需要来自UITabBarController 中所有UITextFields 和所有UIViewControllers 的数据(在保存按钮的IBAction 中)。我该怎么做?谢谢。

这是我在 Storyboard 上的 TabBarController 的图片。

第一个 ViewController 有一个 StudentVC 类。该类有一个文本字段。在 StudentVC.m 中有这段代码:

#import <UIKit/UIKit.h>
#import "CoreDataHelper.h"

@interface StudentVC :  UIViewController <UITextFieldDelegate>

@property (strong, nonatomic) NSManagedObjectID *selectedStudentID;
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, nonatomic) IBOutlet UITextField *studentNameTextField;

@end

studentNameTextField 与 Storyboard 中的字段相连。然后我有一个 TabBar 类,类名为 StudentTBC。在文件 StudentTBC.m 我有这个代码:

- (void)viewDidLoad

    if (debug == 1) 
        NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));
    
    [super viewDidLoad];

    StudentVC *studentVC = [self.tabBarController.viewControllers objectAtIndex:0];
    studentVC.studentNameTextField.text = @"asad";

所以,当我打开 TabBar 时,我会在 studentNameTextField 中看到文本“asad”,但该字段是明确的......所以我也在 IBAction 中添加:保存此代码:

- (IBAction)save:(id)sender 
    if (debug == 1) 
        NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));
    

    StudentVC *studentVC = [self.tabBarController.viewControllers objectAtIndex:0];
    NSString *string = studentVC.studentNameTextField.text;
    NSLog(@"string:%@", string);

但是当我插入字段并按“ulozit”(它保存在捷克语中)时,我得到一个“字符串:null”而不是“字符串:textWhichIWriteToField”。我尝试了索引 0,1,2 但没有任何效果。 :/

编辑于 3.4 15:20

我移动了我的应用程序。第一部分是我的故事板 - UITabBarController 和 3UIViewControllers。我删除了一个导航控制器。在第二部分中,我再次做了一个奥特莱斯。第三部分是保存功能的代码(该代码可以写一个textfield的内容)和TabBarController的ViewDidLoad的代码(代码可以设置一个textfield的字符串)。最后一部分是运行应用程序(结果在控制台中 - 空字符串和清除文本字段)。 我也试过打印这个:

NSInteger countOfViews = [self.tabBarController.viewControllers count];
NSLog(@"count:%ld", (long)countOfViews);

必须是三个?或者?因为我的结果是 0.. 为什么? :/

我的电影:https://www.youtube.com/watch?v=j6p__e48lLI&feature=youtu.be

已编辑 2.4 20:58 --------------------

你好。我尝试了所有选项,但没有任何效果。所以我做了一个新的 SIMPLE 应用程序,其中只有一个带有两个 UIViewController 和一个 UITableViewController 的 UITabBarController(因为导航栏)。请下载项目并自己尝试。只运行,然后单击按钮“TabBar”,您就在 UITabBarController 上。当您按下保存按钮时,它应该显示 UIViewsControllers 的计数和文本字段的值。你能试着告诉我有什么问题吗?谢谢你。这是项目:

https://www.dropbox.com/s/r4jlzadr2us00ad/TBC.zip

【问题讨论】:

你必须使用segues。看看这个,应该有帮助。 ***.com/questions/16997037/… 虽然您链接到的答案是正确的,但您的描述却不是。这与 segues 完全无关。 你没有提到 TabBar 和 ViewController 之间的导航控制器。您只需要稍微修改一下代码(看看我修改后的答案) Damit..有必要使用导航控制器吗?我不知道。我是初学者,在教程中看到过。 请检查我的问题的更新。我删除了导航控制器。 【参考方案1】:

要访问文本字段之一,您可以使用以下代码:

- (IBAction)save 
    YourUIViewController *vc = [self.tabBarController.viewControllers objectAtIndex:indexOfController];
    NSString *str = vc.yourTextField.text;

编辑。你知道你的控制器是如何连接的,现在我意识到你在UIViewController 之后得到了UINavigaitonController。修改后的代码应如下所示:

- (IBAction)save 
    NSArray *navConArr = [self.tabBarController.viewControllers objectAtIndex:indexOfController];
    for(UINavigationController *nc in nacConArr) 
        UIViewController *vc = [nc.viewControllers objectAtIndex:0];
        NSLog(@"And your text is = %@", vc.studentNameTextField.text);
    

更新

我终于解决了问题... TabBarController 的正确代码

- (IBAction)save 
    YourUIViewController *vc = [self.viewControllers objectAtIndex:indexOfController];
    NSString *str = vc.yourTextField.text;

【讨论】:

请问如何获取 viewController 索引?当我有 3 个 UIViews 时,它们有一个索引:0,1,2 与否?因为我尝试了这个索引并且 NSString 仍然为空:/. 属性 viewControllers 是一个数组。您编写的 tabBarController 包含 3 个 UIViewController(不是 UIView!),因此使用索引 0、1 和 2 您应该访问其中一个。 是的,我有 UIViewControllers 而不是 UIView。抱歉表达不好。 无论如何你的问题对我来说并不清楚。请在您的问题中添加更多代码。 我也尝试使用导航控制器和您的代码,但 NSArray navConrArr 为空。【参考方案2】:

请查看 outlets 了解 UITextFields

同时检查输出

NSLog(@"StudentVC textField -- %@",studentVC.studentNameTextField); in save()

如果它也是null,那么你的网点肯定有问题。

【讨论】:

以上是关于如何从 View 获取数据到 UITabBarController的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Swift 4将数据从Pop-Over子视图传递到View Controller

提高从 View 获取数据的查询性能

使用LINQ从两个表(join)获取数据,并使用MVC 5将结果返回到View

从 JSON 文件获取特定数据到列表视图

从以前的VIew控制器获取数据

将表格数据从模板发送到 django 中的 view.py