在ViewControllers之间传递数据是有效的,但Tab Bar Controller没有

时间:2013-12-20 12:05:31

标签: ios objective-c tabbar

有人可以帮助我解决以下问题吗?

我是Xcode的新手,我还在学习它,但我可以弄清楚如何在ViewControllers之间传递数据。

这是我的工作代码:

FirstViewController.h:

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController
- (IBAction)displayView:(id)sender;
@property (weak, nonatomic) IBOutlet UILabel *lblFirst;


@end

FirstViewController.m:

#import "FirstViewController.h"
#import "SecondViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController
@synthesize lblFirst;
SecondViewController *secondViewController;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

    secondViewController.forwarded_lblFirst = lblFirst;

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)displayView:(id)sender {


    [self.view addSubview:secondViewController.view];
}
@end

SecondViewController.h:

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController

@property (nonatomic, retain) UILabel *forwarded_lblFirst;
@property (weak, nonatomic) IBOutlet UITextField *txtSecond;
- (IBAction)btnReturn:(id)sender;
- (IBAction)txtSecond_DidEndOnExit:(id)sender;
- (IBAction)btnSecond:(id)sender;

@end

SecondViewController.m:

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController
@synthesize forwarded_lblFirst;
@synthesize txtSecond;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)btnReturn:(id)sender {
    [self.view removeFromSuperview];
}
- (IBAction)txtSecond_DidEndOnExit:(id)sender {
    forwarded_lblFirst.text = txtSecond.text;
    [txtSecond resignFirstResponder];
    [self.view removeFromSuperview];
}

- (IBAction)btnSecond:(id)sender {
    forwarded_lblFirst.text = txtSecond.text;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [txtSecond resignFirstResponder];
}

@end

这段代码运行正常,我在SecondViewController的文本框中输入的文本(在按下btnSecond或简单地键盘上的Return键之后)显示为FirstViewController上的Label文本。

我的问题是,当我做同样的事情,但使用标签栏应用程序时,第一个标签上的标签不会发生变化。

我可以使用完全相同的代码(更改视图部分除外,因为我使用编程按钮处理第一个应用程序,但对于Tab-Bar-App已经有按钮),还有两个ViewControllers用于Tab Bar App也是(每个标签一个)。 因此代码是相同的,逐行,逐个字符,并且两个应用程序的文件也是相同的(基于视图,Tab-Bar)。

为什么我的代码无法运行?我怎么解决这个问题? 谢谢!

3 个答案:

答案 0 :(得分:4)

您需要阅读一些有关在视图之间传输数据的文章:

谈论你的问题,尝试这种方法:

将属性添加到“应用程序代理”。

分配属性时,请执行以下操作:

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

delegate.myProperty = @"My Value";

然后,在不同的标签中,您可以采用相同的方式检索此属性:

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *valueInTab = delegate.myProperty; 

答案 1 :(得分:1)

解决此问题的另一种方法是使用独立的数据模型。

创建一个对象,为您的应用程序需要以任何非平凡的方式保存,加载,共享或使用的所有数据提供访问和操作方法。使对象可用作Singleton或应用程序委托的属性。发生更改时,请让数据模型更新应用程序状态。当需要显示某些内容时,让控制器从数据模型中获取它并将其发送到视图(MVC!)。

如果您不将内容存储在实际属于模型的控制器中,则无需担心将信息从控制器传递到控制器。

答案 2 :(得分:0)

您需要在第二个视图控制器中使用tabbardelegate,假设您使用此schema

FirstViewController.h

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController

@property (strong, nonatomic) NSString *content;

@end

SecondViewController.m

#import "SecondViewController.h"
#import "FirstViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.tabBarController.delegate = self;

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{

    if ([viewController isKindOfClass:[FirstViewController class]]){
        FirstViewController *vc =( FirstViewController *) viewController;
        vc.content = @"your content";
    }


    return TRUE;
}