有人可以帮助我解决以下问题吗?
我是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)。
为什么我的代码无法运行?我怎么解决这个问题? 谢谢!
答案 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;
}