-2

我有一个问题希望你能帮助我。我有一个带有多个故事板视图的应用程序,每个视图都有一个单独的视图控制器。我希望能够在故事板的所有视图中使用我自己的类。这将使每个视图控制器中的代码更加简洁,整个应用程序更易于调试等。该类将包含变量和方法。

我的总体目标是通过按钮从用户那里收集数据,然后将它们存储在数据库中。可以查看和修改数据,以及生成统计数据。

由于大多数变量和方法将在不同的视图和不同的时间使用,我想将所有这些分隔在单独的文件中。

我还可以告诉你,这不是我懒惰的捷径尝试,我已经在互联网上冲浪了很多很多小时,阅读了数百篇文章等,但我仍然离解决方案还差得远。

非常感谢任何输入!

感谢您抽出宝贵时间阅读本文...

SomeClass.h 有以下代码:

#import <Foundation/Foundation.h>

@interface SomeClass : NSObject
{
NSString *dataOne;
NSString *dataTwo;
NSString *dataThree;
}

- (void) SetDataOne: (NSString*) dataOneReceived;
- (void) SetDataTwo: (NSString*) dataTwoReceived;
- (void) SetDataThree: (NSString*) dataThreeReceived;
- (void) saveSomeData;

@end

SomeClass.m 有以下代码:

#import "SomeClass.h"

@implementation SomeClass   

- (void) SetDataOne: (NSString*) dataOneReceived {
    dataOne = dataOneReceived;
}

- (void) SetDataTwo: (NSString*) dataTwoReceived {
    dataTwo = dataTwoReceived;
}

- (void) SetDataThree: (NSString*) dataThreeReceived {
    dataThree = dataThreeReceived;
}


- (void) saveSomeData {
    // Here I do stuff with dataOne etc…
}



@end

SomeView.h 有以下代码:

#import <UIKit/UIKit.h>
#import "HeadViewController.h"
#import "SomeClass.h"


@interface SomeView : UIViewController

// contains stuff not needed to show here

- (IBAction)Done:(id)sender;

@end

SomeView.m 有以下代码:

#import "SomeView.h"
#import "SomeClass.h"


@interface SomeView ()

@end

@implementation SomeView


- (void)viewDidLoad
{
    [super viewDidLoad];
    SomeClass *someClassObject = [[SomeClass alloc] init];
    // Do any additional setup after loading the view.
}

// Other standard methods omitted


- (IBAction)Done:(id)sender {

    [someClassObject SetDataOne: @”whatever text”];
    [someClassObject SetDataTwo: @”whatever text”];
    [someClassObject SetDataThree: @”whatever text”];
    [someClassObject SaveSomeData];

    Error Msg for all the above: ”Use of Undeclared Identifier ’someClassObject’
}

@end

评论:您可以在上面的代码末尾看到我收到的错误消息。我不知道我做错了什么。我查看了很多关于如何创建和调用类的示例,但似乎无法解决我的问题。另外,我看到一些“SomeClass *someClassObject = [[SomeClass alloc] init];” 在“main.m 文件”中。如果我理解正确,该文件是应用程序启动时第一个加载的文件。如果是这样,那么我不能把它放在那里,因为我必须在几个不同的视图中创建我的类的实例,而不是应用程序启动时的其他时间。这就是我将它放在 viewDidLoad 方法中的原因。

4

3 回答 3

1

几个想法:

  1. 您已经someClassObject为该方法创建了一个局部变量viewDidLoad。看起来你打算让它成为一个类实例变量(或者,更好的是,一个私有类属性,它将为你合成实例变量)。因此:

    @interface SomeView ()
    
    @property (nonatomic, strong) SomeClass *someClassObject;
    
    @end
    
    @implementation SomeView
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.someClassObject = [[SomeClass alloc] init];
    }
    
    - (IBAction)done:(id)sender {
    
        [self.someClassObject setDataOne: @"whatever text"];
        [self.someClassObject setDataTwo: @"whatever text"];
        [self.someClassObject setDataThree: @"whatever text"];
        [self.someClassObject saveSomeData];
    
        // should resolve the Error Msg for all the above: ”Use of Undeclared Identifier ’someClassObject’
    }
    
  2. 顺便说一句,按照惯例,您的方法名称应该以小写字母开头(例如setDataOnenot SetDataOnedone而不是Done等),如上图所示。

  3. 如果您要编写自己的setter,,,setDataOnesetDataTwo,您不妨删除这三个实例变量,删除您的三个setData___方法,并将三个实例变量替换为类属性(并且让编译器不仅合成实例变量,但 setter 也是)。

于 2013-07-01T20:21:08.670 回答
0

您应该在每个头文件的接口部分中添加您的对象,如下所示:

一些视图.h

#import <UIKit/UIKit.h>
#import "HeadViewController.h"
#import "SomeClass.h"


@interface SomeView : UIViewController
{
 SomeClass *someClassObject;
}

// contains stuff not needed to show here

- (IBAction)Done:(id)sender;

@end

然后,当您someClassObject在 ViewDidLoad 内部实例化时,它将在整个视图中持续存在。

于 2013-07-01T20:17:43.973 回答
0

someClassObject 设置在 viewDidLoad 内,因为它没有存储在视图内的任何地方,所以在同一方法结束时将被删除

于 2013-07-01T19:19:01.820 回答