将数据从视图控制器传递到iOS中的标签栏控制器

Kek*_*eks 8 objective-c storyboard tabbarcontroller viewcontroller ios

我正在开发一个iOS应用程序,现在我很茫然.我正在尝试将数据从第一个View Controller传递到TabBarViewController的第一个选项卡(使用storyboard).我发现了很多教程,解释了如何在视图控制器之间传递数据,但是我的标签栏没有任何效果.我知道标签栏控制器包含一种视图数组.视图控制器和标签栏控制器之间的关系使用segue(推送)实现.所以,我认为使用prepareForSegue()方法很容易.像那样:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
 if ([[segue identifier] isEqualToString:@"tab"]) {

 // ...

    } 
 }  
Run Code Online (Sandbox Code Playgroud)

不幸的是,标签栏控制器和每个标签栏视图之间的关系并不真实.这只是一种"关系".这意味着,我没有能够用于上述方法的segue标识符.在这种情况下是否有可能使用prepareForSegue?如果没有,任何想法如何解决这个问题?我知道有一个类似的问题,但答案并没有那么有用.我是否必须为标签栏控制器中的每个选项卡(视图)创建一个新文件?或者是否可以为整个标签栏控制器设置一个类(m.&h.),使用objectAtIndex()访问多个视图?

提前致谢!

Kal*_*esh 8

如果您的层次结构是Viewcontroller-> UItabbarcontroller-> ViewCOntroller

在我的情况下,我必须将数据发送到marketviewcontroller.在tabcontroller中,marketviewcontroller出现在索引0处.

  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
 if ([[segue identifier] isEqualToString:@"tab"])
  {
    UITabBarController *tabar=segue.destinationViewController;
    MarketViewController *marketViewcontroller=[tabar.viewControllers objectAtIndex:0];

   // pass data to market view controller
    [marketViewcontroller passobject:Yourdata];
 //   or 
  marketViewcontroller.value=Yourdata
  } 
  }  

in MarketViewController.h 
 @property(nonatomic,retain) NSString * value;
Run Code Online (Sandbox Code Playgroud)


Yaz*_*zid 8

这是我的设置有效:

  1. 设置Segue:
    1. 设置视图控制器,带有segue到标签栏控制器,在故事板中有2个子视图控制器
    2. 指定segue标识符(tab)
  2. 故事板中的安装类:
    1. View Controller class = ViewController
    2. 标签栏控制器类= TabBarController
    3. 标签栏控制器子视图控制器类= TabsViewController(两者之间共享)
  3. labelString标签栏控制器中的安装属性:

    1. TabBarController.h:

      @property (nonatomic, strong) NSString *labelString;
      
      Run Code Online (Sandbox Code Playgroud)
    2. TabBarController.m:

      @synthesize labelString;
      
      Run Code Online (Sandbox Code Playgroud)
  4. 设置prepareForSegue方法ViewController.m:

    #import "TabBarController.h"
    
    ...
    
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
        if ([[segue identifier] isEqualToString:@"tab"]){
            TabBarController *tabBar = [segue destinationViewController];
            [tabBar setLabelString:[NSString stringWithFormat:@"This has been set"]];
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 设置UILabelS代表儿童标签栏视图控制器.

    1. 将默认UILabel控件拖到两个子视图控制器中
    2. 创建属性TabsViewController.h:

      @property (nonatomic, strong) IBOutlet UILabel *label;
      
      Run Code Online (Sandbox Code Playgroud)
    3. 5.15.2在故事板了

  6. 设置ViewDidLoad方法TabsViewController.m:

    #import "TabBarController.h"
    
    ...
    
    @synthesize label;
    
    ...
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        TabBarController *tabBar = (TabBarController *)self.tabBarController;
        label.text = [NSString stringWithFormat:@"Tab %i: %@",[tabBar.viewControllers indexOfObject:self],tabBar.labelString];
    }
    
    Run Code Online (Sandbox Code Playgroud)

现在,点击第1和第2个选项卡将有标签显示Tab 0: This has been setTab 1: This has been set分别.