从另一个类访问一个属性

时间:2015-07-19 14:24:30

标签: ios objective-c iphone

我正在尝试构建一个应用程序,用户在文本字段输入一个数字,按下按钮后,另一个视图会显示该输入的结果。

用户输入的每个数字应在第二个视图中返回不同的值。由于数据量很大,我创建了一个自定义类来存储所有这些数据。现在我不知道如何从这个自定义类的字段中访问文本。你能救我吗?

问题在于:

int intVal = [[ViewController.fieldLabel text] intValue];

整个代码:

MainView.m

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    ResultViewController *resultController = (ResultViewController *)segue.destinationViewController;
    resultController.segueLabel = [self number];
}



- (IBAction)showResultView:(id)sender {
}

@end

Library.h

#import <Foundation/Foundation.h>

@interface LibraryData : NSObject

- (NSString *)number;

@end

Library.m

#import "LibraryData.h"
#import "ViewController.h"

@implementation LibraryData

- (NSString *)number {
    int intVal = [[ViewController.fieldLabel text] intValue];
    if (intVal < 5000) {
        return @"Poor!";
    }
    else {
        return @"Rich!";
    }
}


@end

3 个答案:

答案 0 :(得分:1)

由于这种情况下的库就像你的模型一样,因此ViewController负责设置和提取数据。该库不会(也不应该)知道有关ViewController类的任何信息。这是您遇到的问题的一个很好的解决方案:

首先,您需要ViewController中的Library实例:

@interface ViewController ()
// Make sure you import library above
@property (strong, nonatomic) Library *library;
@end

创建实际实例:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.library = [Library new];
}

然后在按钮点击中,您应该访问视图的文本字段并将其设置在库中:

- (IBAction)showResultView:(id)sender {
    self.library.number = [[self.fieldLabel text] intValue];
}

答案 1 :(得分:0)

据我了解你的问题,如果你需要一个方法,根据提供的数字返回字符串标题,你可以将你的方法作为LibraryData类的类方法,而不是实例方法,如:< / p>

+ (NSString *)titleStringFromInt: (NSInteger) intVal {
    if (intVal < 5000) 
        return @"Poor!";
    else
    return @"Rich!";
}

从您的控制器中调用它,例如[LibraryData titleStringFromInt: [[ViewController.fieldLabel text] intValue]];

如果您需要将数据实际存储到可从应用程序中的所有其他控制器访问的LibraryData类中,我建议采用单例模式实现。

例如使用块:

+ (LibraryData *)instance
{
   static dispatch_once_t onceToken = 0;

   __strong static id _sharedObject = nil;

   dispatch_once(&onceToken, ^{
       _sharedObject = [[self alloc] init];
   });

   return _sharedObject;
}

并调用它,就像您的ViewController代码中的[LibraryData instance] .number一样。 无论如何,我认为将你的变量的getter方法中的if / else代码移动到某个帮助器类方法是一件好事。

答案 2 :(得分:0)

所以它确实看起来像你必须做的一些事情,比如使用属性和初始化单例来保存新值。屁股!我会告诉你你需要做什么:)

使用前缀文件

将单例添加到项目中
  

singleton 是一种特殊的类,其中只有一个实例   当前进程存在类。 (对于iPhone应用程序,   整个应用程序共享一个实例。)

所以这将有所帮助,因为您只需要初始化一次并使用前缀文件在应用程序的任何位置使用它。首先让我们添加该文件:

**添加前缀文件**

如果项目中仍有此文件夹,支持文件,请右键单击此文件夹,然后点击添加新文件... 。添加名为 PCH文件的内容。您可能需要在左侧的 iOS 标签中查找它:

preview-prefix file

点击下一步后,将此文件命名为 Prefix.pch 。请确保将此文件添加到目标

接下来,您需要通过以下方式将此前缀文件分配给目标:

项目文件&gt; 选择目标&gt; 构建设置标签&gt; 搜索&#39;前缀标题&#39; 并查找行前缀标题,然后双击输入值:

preview-target file

您在前缀框中输入的值是&#34; 包含文件夹 / Prefix.pch 。包含文件夹通常是项目的确切名称。例如我的项目名为 ios-objective-c ,因此我将进入 ios-objective-c / Prefix.pch ;是的,我知道在我的屏幕截图中标有&#39; overstack-Prefix.pch&#39; :P你必须确保它们匹配:)

尝试构建您的项目,点击cmd-B :)如果出现错误,说明此文件之类的内容不存在,那是因为您输错了前缀框

中的值

NEXT!正在添加您的单身类:)

添加单例类

这是一个很多的复制和粘贴,但我会解释其中的一些。在评论中向我提问,我将深入探讨:)

1.添加文件

添加新的 Cocoa Touch Class 文件,并将其命名为图书馆。我把它放在AppDelegate.m下面。但无论好在哪里:)这个的子类将是 NSObject 。现在,您希望新文件看起来像这样:

<强> Library.h

#import <Foundation/Foundation.h>

@interface Library : NSObject

//This method, or function, is how you will access this class and all its properties and instant methods. the plus means this method is a class method vs an instant method
+ (Library *)controller;

@end

<强> Library.m

#import "Library.h"

@implementation Library

+ (Library *)controller {
    static Library *controller = nil;
    if (!controller)
        controller = [[Library alloc] init];
    return controller;

}

- (id)init {
    if (!(self=[super init])) return nil;
    return self;

}

@end

允许其他课程使用此课程

现在没有其他类可以使用或调用任何这些方法,您要做的最后一件事就是在代码中添加import "Library.h"!因此,您可以使用前缀文件:

<强> Prefix.pch

#ifndef ios_objective_c_overstack_Prefix_pch
#define ios_objective_c_overstack_Prefix_pch

// Include any system framework and library headers here that should be included in all compilation units.
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.

#import "Library.h"

#endif

现在再次构建并尝试将此代码粘贴到 ViewController 类的任何位置:[Library controller];现在它只初始化单例,但这很好。现在您需要添加属性以保存到此单例。

向类添加属性

返回图书馆类并粘贴:

<强> Library.h

...
@interface Library : NSObject

@property int inputValue;

+ (Library *)controller;
...

就是这样!当您使用对象类型(如NSString *或NSNumber *)时,通常会有更多属性。这是您为NSNumber *

粘贴的内容
@property ( nonatomic, retain) NSNumber *inputValue;

你基本完成了!如果要从视图控制器设置此值:

[[Library controller] setInputValue: <#(int)#>];

并阅读值:

[[Library controller] inputValue];

此单身人士将在您的应用中保存您的价值。希望这能回答你的问题:)