我不是OOP的新手,但我对目标c非常陌生,而且我从两个不同的视图控制器到达模型时遇到了麻烦,一个是设置另一个来获取数据。这是我的模特:
#import <Foundation/Foundation.h>
@interface ModelUnit : NSObject{
NSString * nickname;
int total;
}
- (void)setTotal:(int)newTotal;
- (void)setName:(NSString *)nick;
- (NSString *)getName;
@end
#import "ModelUnit.h"
@implementation ModelUnit
- (void)setTotal:(int)newTotal{
total = newTotal;
}
- (void)setName:(NSString *)nick{
nickname = nick;
}
- (NSString *)getName{
return nickname;
}
@end
以下是我尝试在初始viewcontroller中设置昵称的方法:
//.h
@interface introViewController : UIViewController{
ModelUnit * modl;
}
-(ModelUnit *) modl;
-(IBAction)nickEntered:(UITextField *)sender;
@end
//.m
-(ModelUnit *) modl{
if(!modl){
modl = [[ModelUnit alloc] init];
}
return modl;
}
- (IBAction)nickEntered:(UITextField *)sender{
[[self modl] setName:[sender text]];
ViewController *vew = [[ViewController alloc] initWithNibName:nil bundle:nil];
[self presentViewController:vew animated:NO completion:Nil];
}
以下是我尝试在最后一个viewcontroller中接收并显示它的方法:
- (void)viewDidLoad
{
[super viewDidLoad];
introViewController *pnt = [[introViewController alloc] initWithNibName:nil bundle:nil];
[display setText:[[pnt modl] getName]];
}
但是当我将NSlog记录到控制台时,它总是将其打印为null。我知道这是一个非常新手的问题,但我完全陷入困境。谢谢你的帮助。
答案 0 :(得分:1)
这是因为每个UIViewController
实例都引用了模型类的不同实例(实际上,在第二种情况下是非实例)。
在“最后一个”视图控制器中创建@property
(看起来像“ViewController”的类名称),如:
@property (strong, nonatomic) Model *model;
然后,在推送第二个视图控制器时,设置其model
属性,如下所示:
ViewController *vew = [[ViewController alloc] initWithNibName:nil bundle:nil];
vew.model = self.modl;
[self presentViewController:few animated:NO completion:NULL];
这样,你就传递了Model
课程的同一个实例。您正在尝试访问一个从未初始化的属性,这就是您获取nil
的原因。
答案 1 :(得分:1)
如果您不是OOP的新手,您应该很容易看到自己犯的错误。您正在尝试从刚刚初始化的对象中检索值。
在初始化第二个对象时,需要传递数据的位置在第一个对象中。
在这一行之间:
ViewController *vew = [[ViewController alloc] initWithNibName:nil bundle:nil];
这一行:
[self presentViewController:vew animated:NO completion:Nil];
您仍然在第一个对象中,并且您拥有对第二个对象的引用。给ViewController
类(更好的名称和)NSString
属性以保存getName
方法返回的数据。然后在我发布的两行之间设置该属性。
此外,Objective-C并未使用get
命名其getter。