单例UIViewController

十一月四日

我正在尝试从随机类中添加一些数据到我的viewController中,

因此,为了始终保持相同的数据,我在UIViewController上执行了单例操作,但是它无法正常工作,因此我从未在tableview上获取数据。

这是我添加到我的UIViewController的内容:

+(id)sharedMBVC {
   static MBViewController *sharedMBVC ;
    @synchronized(self) {
        if (!sharedMBVC)
            sharedMBVC = [[MBViewController alloc] init];
        return sharedMBVC;
    }
}

从我的课上,我通过这样做来称呼它:

  MBViewController *vc = [MBViewController sharedMBVC];

我是否必须在某个地方设置我在viewcontroller的viewDidLoad中声明的NSArrays的内容?或还有其他事情要做。

PS:我以前在课堂上做过,vc = (MBViewController *)[[[[UIApplication sharedApplication] delegate] window] rootViewController];但是现在我的uiviewcontroller不再是rootview了,这就是为什么我试图寻找其他方式来访问它,而我猜最好的解决方案是做一个单例

你能帮我吗

雾雾

好的,所以您遇到的问题是显示数组的viewController也“拥有”了数组。这意味着(使用当前设置)要能够更改数组,您需要拥有viewController才能访问数组。

您需要通过从该viewController中删除数组来更改此设置。

您仍然可以单身(如果愿意)执行此操作,但是创建一个名为的全新类ArrayManager

这将包含数组和所有用于更新数组的方法。

因此,例如,如果您的viewController有一个名为的方法,- (void)addObjectToArray:(id)object;则将该方法移至ArrayManagersingleton类。

现在,在显示的viewController中,您可以...

[[ArrayManager sharedInstance] getSomeDataFromTheArray];

在必须更新阵列的地方,您可以...

[[ArrayManager sharedInstance] addObjectToArray:someObject];

现在,您完全不必担心传递viewController了。

这可以通过各种方法来改进。例如,您可能根本不需要单身人士,而可以通过设置属性等将这个ArrayManager类并注入到需要它的地方...

同样,您可以使用CoreData来存储信息。

另外,您的单例方法也不正确。苹果推荐的方式是使用...

+ (ArrayManager *)sharedInstance
{
    static dispatch_once_t once;
    static ArrayManager *arrayManager;
    dispatch_once(&once, ^{
        arrayManager = [[ArrayManager alloc] init];
    });
    return arrayManager;
}

重写您的单身人士...

.h文件

@interface PTVData : NSObject

+ (PTVData *)sharedInstance;

- (void)addSensor:(NSString *)sensorName;
- (NSInteger)numberOfSensors;
- (NSString *)sensorAtIndex:(NSUInteger)index;

@end

.m文件

@interface PTVData ()

@property (nonatomic, strong) NSMutableArray *sensors;

@end

@implementation PTVData

+ (PTVData)sharedInstance
{
    static PTVData *sharedPTVData;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedPTVData  = [[PTVData alloc] init];
    });
    return sharedPTVData;
}

- (id)init
{
    if (self = [super init]) {
        _sensors = [[NSMutableArray alloc] initWithObject:@"None"];
    }
    return self;
}

- (void)addSensor:(NSString *)sensorName
{
    if (sensorName
        && ![self.sensors containsObject:sensorName]) {
        [self.sensors addObject:sensorName];
    }
}

- (NSInteger)numberOfSensors
{
    return self.sensors.count;
}

- (NSString *)sensorAtIndex:(NSUInteger)index
{
    return self.sensors[index];
}

@end

通过这样做,您可以隐藏实际的传感器阵列。它只能通过PTVData该类直接访问

现在,在您的tableview方法中,您可以执行...

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[PTVData sharedInstance] numberOfSensors];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = ...

    cell.textLabel.text = [[PTVData sharedInstance] sensorAtIndex:indexPath.row];

    return cell;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章