9

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

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

 // ...

    } 
 }  

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

提前致谢!

4

6 回答 6

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;
于 2013-07-19T09:57:44.620 回答
8

这是我的有效设置:

  1. 设置转场:
    1. 在 Storyboard 中设置带有 segue 的视图控制器到带有 2 个子视图控制器的选项卡栏控制器
    2. 指定 segue 标识符 ( tab)
  2. 在情节提要中设置类:
    1. 视图控制器类 =ViewController
    2. 标签栏控制器类 =TabBarController
    3. 标签栏控制器子视图控制器类= TabsViewController(两者之间共享)
  3. labelString标签栏控制器中的设置属性:

    1. TabBarController.h

      @property (nonatomic, strong) NSString *labelString;
      
    2. TabBarController.m

      @synthesize labelString;
      
  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"]];
        }
    }
    
  5. 子标签栏视图控制器的设置UILabel

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

      @property (nonatomic, strong) IBOutlet UILabel *label;
      
    3. 在情节提要5.1中挂钩5.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];
    }
    

现在单击第一个和第二个选项卡将分别显示标签Tab 0: This has been setTab 1: This has been set

于 2013-07-19T12:53:20.117 回答
1

看看单身人士。在选项卡中,您创建一个实现单例模板的帮助程序类的实例,确保实际上只有一个实例。这意味着当第二个选项卡实例化相同的帮助类时,它将可以访问相同的对象,您可以使用该对象来共享您的数据......

例如:http ://www.galloway.me.uk/tutorials/singleton-classes/

于 2013-07-19T10:46:14.353 回答
1

你是如何从你的 UIViewController 显示你的 TabBarViewController 的?

我猜有一个segue。如果这是您这样做的方式,您可以将数据传递给此 UITabBarController,它是选项卡内所有控制器的“父级”。

假设您想将字符串传递给 UITabBarController,您将在此控制器中定义一个属性并将其设置在 segue 之前。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
      if ([[segue identifier] isEqualToString:@"tab"])
      {
          UITabBarController *tabBarVC=segue.destinationViewController;
          tabBarVC.stringToSet = @"hi";
      }
  }

然后,使用委托方法,您可以选择视图控制器,因此您可以将 parent 属性传递给孩子:

- (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController {
    viewController.stringToSet = self.stringToSet // self is UITabBarController
}
于 2013-07-19T10:29:49.843 回答
0

最简单的方法是创建一个自定义类并将值从控制器设置到自定义类,然后从自定义类获取值到控制器。

示例代码在这里:

首先创建自定义类例如

应用程序.h

+(void)setXxxName:(NSString *)str;
+(NSString *)getXxxName;

应用程序.m

static NSString *xxxname;

+(void)setXxxName:(NSString *)str{

   xxxname=str;
 }

+(NSString *)getXxxName{

  return xxxname;
 } 

第一控制器.m

在控制器中导入自定义类

#import "AppUtility.h"

将值从第一个控制器设置为自定义类,使用以下代码设置值:

[AppUtility setXxxName:@"xyz"];

第二个控制器.m

在控制器中导入自定义类

#import "AppUtility.h"

这里从自定义类中获取值,使用下面的代码来获取值:

NSString *str = [AppUtility getXxxName];

在 appUtility 类中使​​用 nslog 语句来验证值是否正确

于 2013-11-19T06:30:53.867 回答
0

第一件事:

1-您出于某种原因想将数据传递到您的标签...

或者:

2-您想将数据传递到您的选项卡,以便您可以传递给另一个UIViewController

如果是第二种选择,最常见的模式是单例模式。您可以在哪里保留通用数据,这些数据可以被应用程序的不同部分使用/重用。

于 2013-07-19T09:53:55.610 回答