【问题标题】:Creating an Instance of Class in IOS 6 [closed]在 IOS 6 中创建类的实例 [关闭]
【发布时间】:2013-07-01 19:10:57
【问题描述】:

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

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

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

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

非常感谢任何输入!

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

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 方法中。

【问题讨论】:

  • “该文件是应用程序启动时第一个加载的文件” - 我建议您在尝试深入 iOS 开发之前先退一步学习 C。不加载文件,而是调用函数,main() 是第一个。
  • 缩小您的问题范围并删除不必要的代码 sn-ps。以目前的形式,这是一个无处可去的问题。
  • 我觉得你需要找几本关于编程的好书。 “上网几个小时”不是学习编程的方式。
  • Hot Licks - 你对一本适合初学者但非常详细的好书有什么建议吗?

标签: objective-c class ios6 instance


【解决方案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. 顺便说一句,按照惯例,您的 method names should start with a lowercase letter(例如 setDataOne 不是 SetDataOnedone 而不是 Done 等),如上所示。

  3. 如果你要编写自己的setter,setDataOnesetDataTwo等,不妨去掉这三个实例变量,去掉你的三个setData___方法,替换掉这三个具有类属性的实例变量(让编译器不仅合成实例变量,还合成 setter)。

【讨论】:

  • 感谢您抽出宝贵时间,非常感谢!就 1. 而言,在我的程序中似乎没问题,除了它在“任何文本”之前抱怨“@”符号。就 2. 而言,请注意。
  • 最后就三个方面,我试试这个,看起来更简洁,谢谢!
  • @MrEmkei 关于抱怨“@”,我怀疑它真的是抱怨引号。我刚刚剪切并粘贴了您的代码,但我注意到您的原始代码示例使用了弯引号(“关闭”引号),并且我已经更新了我的答案以使用普通的旧引号。也许您在某些文字处理器中编辑了问题,将标准引号替换为卷曲版本。 (我知道它们看起来很相似,但它们是完全不同的角色。)
  • 我在您的第三个示例中进行了更改,因此在 SomeClass.h 中我声明了以下 NSString 属性:dataOne、dataTwo、dataThree。然后我在 SomeView.m 中执行以下操作: SomeClass *someClassObject = [[SomeClass alloc] init]; someClassObject.dataOne = @“随便什么文字”]; someClassObject.dataTwo = @“whatever text”]; someClassObject.dataThree = @“whatever text”]; [someClassObject saveSomeData];最后一行仍然收到错误消息:“No visible @interface for ...”。
  • 不确定那些额外的“]”来自哪里,它们不在我的代码中。无论如何,最后一个错误是由于我今天发现的错字造成的。感谢您抽出宝贵时间帮助我,现在我终于可以开始使用类更详细地构建应用程序了 :-) 我会去斯坦福看看,谢谢你的提示!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你应该像这样在每个头文件的接口部分添加你的对象:

    SomeView.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
    

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

    【讨论】:

    • 谢谢!但它不起作用,我得到错误消息“'TeeStat'没有可见的@interface声明选择器'SetClubHit'等......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2020-10-28
    相关资源
    最近更新 更多