ОК, поэтому проблема заключается в том, что viewController, который отображает массивы, также «владеет» массивами. Это означает, что (с вашей текущей настройкой), чтобы иметь возможность изменять массивы, вам нужно получить контроль над viewController, чтобы иметь доступ к массивам.
Вам необходимо изменить это, удалив массивы с этого viewController.
Вы все еще можете сделать это с помощью сингла (если хотите), но создайте совершенно новый класс под названием что-то вроде ArrayManager
.
Это будет содержать массивы и ВСЕ методы обновления массивов.
Так, например, если ваш viewController имеет метод под названием - (void)addObjectToArray:(id)object;
, то переместите этот метод на одноэлементный класс ArrayManager
.
Теперь в вашем отображении ViewController вы можете сделать ...
[[ArrayManager sharedInstance] getSomeDataFromTheArray];
И в том месте, которое должно обновить массив, который вы можете сделать ...
[[ArrayManager sharedInstance] addObjectToArray:someObject];
Теперь вы не нужно беспокоиться о том, чтобы пропустить viewController вообще.
Это может быть улучшено с помощью различных вещей. Например, вы, возможно, не нужен синглтон на все и можете просто взять этот ArrayManager
класс и впрыснуть его в те места, которые нуждаются в ней путем установки свойства и т.д. ...
Кроме того, вы могли бы использовать CoreData для хранения информации.
Кроме того, ваш метод singleton неверен. Способ, рекомендованный Apple, - использовать ...
+ (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;
}
Не делайте этого. Это плохо. Что вы делаете, что заставляли вас использовать синглтон? Там ** - это лучший способ сделать это. – Fogmeister
@Fogmeister the main pb - это то, что теперь я использую AMSlideMenu, что его MainVC становится rootview, поэтому теперь у меня нет доступа к моим методам MBViewController: si хочет всегда иметь текущий MBViewController с обновленными NSArrays – fourthnovember
Зачем вам нужно доступ к MBViewController повсюду? Это просто, чтобы получить массивы? – Fogmeister