0

我正在制作一个程序,它要求所有类都可以访问一个视图控制器中的属性。我将如何制作全球房产?

4

1 回答 1

2

几个选项:

  1. 理想情况下,您应该避免将其设为全局,而是从一个视图控制器传递属性。有关示例,请参见这个出色的答案(例如将其设置为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. 您的应用实际上已经有一个单例,即应用委托,您可以向其中添加一个属性并使用它。例如,如果您someOtherString在应用程序委托的 .h 中定义了一个属性,那么您可以像这样引用它:

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

    如果我打算对模型数据使用单例,我更喜欢创建自己的,但这是某些人使用的另一种方法。

于 2013-08-29T15:44:26.040 回答