从另一个class级访问一个属性

我试图build立一个应用程序,用户在文本框中input一个数字,按下button后,另一个视图将显示该input的结果。

用户input的每个数字应在第二个视图中返回不同的值。 由于数据将是巨大的,我创build了一个自定义类来存储所有这些数据。 现在我不知道如何从这个自定义类的字段中访问文本。 你可以帮我吗?

现在的问题在于:

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 

由于在这种情况下库的行为就像你的模型一样,你的ViewController的责任是从它设置和提取数据。 图书馆不(也不应该)知道关于ViewController类的任何事情。 这是您正面临的问题的一个很好的解决scheme:

所以首先,你需要在你的ViewController中有一个库实例:

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

创build实际的实例:

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

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

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

据我了解你的问题,如果你需要一个方法返回string标题根据提供的数量,你可以使你的方法作为你的LibraryData类的类方法,而不是实例方法,如:

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

并从你的控制器调用它,像[LibraryData titleStringFromInt: [[ViewController.fieldLabel text] intValue]] ;

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

例如使用块:

 + (LibraryData *)instance { static dispatch_once_t onceToken = 0; __strong static id _sharedObject = nil; dispatch_once(&onceToken, ^{ _sharedObject = [[self alloc] init]; }); return _sharedObject; } 

并从您的ViewController代码中调用它,如[LibraryData实例] .number。 无论如何,我认为把你的if / else代码从你的variables的getter方法移到一些辅助类方法是一件好事。

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

使用前缀文件将单例添加到您的项目

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

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

**添加前缀文件**

如果您的项目中仍有该文件夹,请单击此文件夹并单击添加新文件…。 添加所谓的PCH文件 。 您可能需要在左侧的iOS选项卡中查找它:

预览前缀文件

点击下一步之后 ,将该文件命名为Prefix.pch 。 确保你将这个文件添加到你的目标

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

项目文件 > select您的目标 > 生成设置选项卡 > search“前缀头” ,查找行前缀头并双击input一个值:

预览目标文件

在这个前缀框中input的值是“ 包含的文件夹 / Prefix.pch 。包含的文件夹通常是你的项目的确切名称,例如我的项目被命名为ios-objective-c ,因此我将进入ios-objective-c / Prefix.pch ;是的,我知道在我的屏幕截图标记为“overstack-Prefix.pch”:P你只需要确保他们匹配:)

尝试build立你的项目,命中cmd-B :)如果一个错误显示说这样的文件不存在,那是因为你在前缀框中input了错误的值

下一个! 正在添加你的单身类:)

添加你的Singleton类

这一个是很多复制和粘贴,但我会解释一些。 问我任何意见,我会深入:)

1.添加文件

添加一个新的Cocoa Touch Class文件并称之为Library 。 我把它放在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 

允许其他类使用这个类

现在没有其他的类可以使用或者调用这些方法了,最后你要做的就是在你的代码中joinimport "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 

现在再次构build并尝试将此代码粘贴到ViewController类中的任何位置: [Library controller]; 现在只是初始化单身人士,但这很好。 现在你需要的是添加属性来保存到这个单身人士。

将属性添加到类

回到Library类并粘贴:

Library.h

 ... @interface Library : NSObject @property int inputValue; + (Library *)controller; ... 

就是这样! 当使用对象types时,通常有更多属性,比如NSString *或NSNumber *。 这是你要粘贴的NSNumber *

 @property ( nonatomic, retain) NSNumber *inputValue; 

你基本完成了! 如果你想从你的视图控制器设置这个值:

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

并阅读价值:

 [[Library controller] inputValue]; 

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