好的,所以这是我昨晚问的问题的延伸。我对如何使用各种技术在视图控制器之间传递数据有一点了解。我想进入MVC路线,创建一个Singleton类似乎是最接近MVC的概念。
基本上我创建了一个带有两个View Controllers和一个singleton类的简单应用程序。我试图将文本字段的值传递给UILabel。无论出于何种原因它都无法正常工作这就是我的代码。
ViewController.h
#import <UIKit/UIKit.h>
#import "Model.h"
#import "ViewController2.h"
@interface ViewController : UIViewController {
NSString *text2pass;
}
@property (weak, nonatomic) IBOutlet UITextField *tf;
@property (weak, nonatomic) IBOutlet UILabel *btn;
- (IBAction)go:(id)sender;
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize tf = _tf;
@synthesize btn = _btn;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *tfstring = _tf.text;
NSLog(@"string = %@",tfstring);
}
- (void)viewDidUnload
{
[self setTf:nil];
[self setBtn:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (IBAction)go:(id)sender {
NSLog(@"btn pressed");
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController2 *vc2 = (ViewController2 *) [storyboard instantiateViewControllerWithIdentifier:@"home"];
text2pass = _tf.text;
[self passValues];
[self presentModalViewController:vc2 animated:YES];
}
-(void) passValues {
Model *model = [Model sharedModel];
model.passedText = text2pass;
}
@end
ViewController2.h
#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface ViewController2 : UIViewController {
NSString *passedText;
}
@property (nonatomic)NSString *passedValue;
@property (weak, nonatomic) IBOutlet UILabel *lbl;
- (IBAction)back:(id)sender;
@end
ViewController2.m
#import "ViewController2.h"
@interface ViewController2 () {
NSString *passedtext;
}
@end
@implementation ViewController2
@synthesize lbl = _lbl;
@synthesize passedValue = _passedValue;
- (void)viewDidLoad
{
// do code stuff here
NSLog(@"passedText = %@",passedText);
_lbl.text = passedText;
[super viewDidLoad];
}
- (void)viewDidUnload
{
[self setLbl:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (IBAction)back:(id)sender {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = (ViewController *) [storyboard instantiateViewControllerWithIdentifier:@"welcome"];
[self presentModalViewController:vc animated:YES];
}
@end
Model.h
#import <Foundation/Foundation.h>
@interface Model : NSObject {
NSString *passedText;
}
@property (nonatomic, strong) NSString* passedText;
+ (Model *) sharedModel;
@end
Model.m
#import "Model.h"
@implementation Model
@synthesize passedText = _passedText;
static Model *sharedModel = nil;
+ (Model *) sharedModel {
@synchronized(self){
if (sharedModel == nil){
sharedModel = [[self alloc] init];
}
}
return sharedModel;
}
@end
可以从此处http://chrisrjones.com/files/KegCop-Test.zip
完整下载项目如果您知道为什么UILabel没有显示文本字段文本,请告诉我。哦,我几乎跟着这个 - &gt; http://www.youtube.com/watch?v=ZFGgMPcwYjg&feature=plcp
答案 0 :(得分:5)
你的寻址和内存管理很简单......关闭。首先,绝对没有理由为此创建一个单例,但这不是重点。
其次,在声明属性时,(atomic,assign)默认为如果没有另外指定,这意味着你的字符串:
@property (nonatomic)NSString *passedValue;
是弱酱,成熟时可以立即解除分配和破坏。声明copy
,strong
或retain
。
第三,在推送视图控制器中绝对没有引用你的单例,但你似乎相信在不同类中被命名相同的对象保留它们的值(特别是在#import'ed时)。不是这样。您需要引用您的单例并将[Model sharedModel].passedText
的值拉入该文本字段。
事实上,我将您的样本分为两行:
//ViewController2.m
#import "ViewController2.h"
//actually import the singleton for access later
#import "Model.h"
@interface ViewController2 () {
NSString *passedtext;
}
@end
@implementation ViewController2
@synthesize lbl = _lbl;
@synthesize passedValue = _passedValue;
- (void)viewDidLoad
{
// do code stuff here
NSLog(@"passedText = %@",passedText);
//actually reference the singleton this time
_lbl.text = [Model sharedModel].passedText;
[super viewDidLoad];
}
- (void)viewDidUnload
{
[self setLbl:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (IBAction)back:(id)sender {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = (ViewController *) [storyboard instantiateViewControllerWithIdentifier:@"welcome"];
[self presentModalViewController:vc animated:YES];
}
@end
产生这个:
答案 1 :(得分:1)
我不建议使用Singleton作为在应用程序周围传递数据的好方法。大多数应用程序都很简单,不需要这种中央访问,它通常会造成维护噩梦...但我不认为你使用Singleton这一事实对于让代码正常工作非常重要。< / p>
假设您可以访问ViewController1中的数据,在您的情况下通过Model的Singleton实例(需要更具描述性的名称),那么您所要做的就是在创建时将数据传递给ViewController2,提出,根本不需要单身人士。
创建控制器后,设置所需的数据,然后显示视图控制器 - 这基本上就是你正在做的事情。
至于它为什么不起作用:是否显示了视图控制器,而不是正确的数据?或者实际存在控制器问题?我将在ViewController1的go:
操作中设置断点,确保您期望的数据位于文本字段中,正确填充模型,并且该值在ViewController2中正确地从模型中拉出。
除非你删除了一些代码,否则看起来你在ViewController1中正确填充了Model属性,但是在ViewController2中你引用了一个本地ivar passedText
而不是从模型中拉出它。
另外,从提供的模态视图控制器中返回的方法通常是关闭该控制器,而不是重新创建初始控制器并将其显示在顶部。