我正在尝试从随机类中添加一些数据到我的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;
则将该方法移至ArrayManager
singleton类。
现在,在显示的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] 删除。
我来说两句