如何从不同的视图控制器到达模型?

时间:2014-03-11 00:41:49

标签: ios objective-c

我不是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。我知道这是一个非常新手的问题,但我完全陷入困境。谢谢你的帮助。

2 个答案:

答案 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。