繁体   English   中英

全球财产目标c

[英]Global Property- objective c

我正在编写一个程序,它要求所有类都可以访问一个View Controller中的属性。 我将如何打造全球资产?

有两个选择:

  1. 理想情况下,应避免将其设置为全局,而应从一个视图控制器传递该属性。 有关示例(例如,在prepareForSegue设置),请参prepareForSegue 出色的答案

  2. 另外,您可以创建一个单例,并使其成为该单例的属性。 例如, Model.h

     // Model.h @import Foundation; NS_ASSUME_NONNULL_BEGIN @interface Model : NSObject @property (class, strong, readonly) Model *sharedModel; @property (nonatomic, copy, nullable) NSString *myString; - (id)init __attribute__((unavailable("Use +[Model sharedModel] instead"))); + (id)new __attribute__((unavailable("Use +[Model sharedModel] instead"))); @end NS_ASSUME_NONNULL_END 

    Model.m

     // Model.m #import "Model.h" @implementation Model + (instancetype)sharedModel { static id sharedMyModel = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedMyModel = [[self alloc] init]; }); return sharedMyModel; } @end 

    然后您的各种控制器可以使用此单例类并引用您需要从其他类访问的属性,例如:

     #import "SomeViewController.h" #import "Model.h" @implementation SomeViewController - (void)viewDidLoad { [super viewDidLoad]; Model *model = [Model sharedModel]; model.myString = @"abc"; } @end 

     #import "AnotherViewController.h" #import "Model.h" @implementation AnotherViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *string = [[Model sharedModel] myString]; // Do whatever you want with the string } @end 
  3. 您的应用程序实际上已经有一个单例,即应用程序委托,您可以在其中添加一个属性,然后使用它。 例如,如果您在应用程序委托的.h中定义了属性someOtherString ,则可以这样引用它:

     AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; appDelegate.someOtherString = @"xyz"; 

    如果要将单例用于模型数据,则更喜欢创建自己的模型,但这是某些人使用的另一种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM