将数据存储在NSArray中的自定义类中,并在其他类/控制器中使用

时间:2013-11-04 14:30:47

标签: ios iphone objective-c cocoa-touch cocoa

在制作我的第一个应用程序时,我真的陷入了一个小问题,在SOF上尝试过各种各样的帖子以及许多变化,但却无法做我想做的事情。
我有一个需要一些数据的UITableViewController,它需要的数据我在一个自定义数据类的NSArray中填充,我管理我项目所需的所有数据。 我的数据类中有一个实例变量/属性,它从函数中获取所需的数据。数据在函数中显示良好且良好但我无法在我的主TableView函数中访问它,我尝试创建数据类对象并访问它但显示为null。

以下是一些示例代码。

dataClass.h

@interface GDAPIhandler : NSObject {  
        NSMutableArray *relImageUrl;  
    }  
@property (strong,nonatomic) NSArray *timeLine;  
@property (strong,nonatomic) NSMutableArray *relImageUrl;

dataClass.m

self.relImageUrl = [[NSMutableArray alloc] init];
[self.relImageUrl addObject:[UIImage imageWithData:thumb]];

tableViewController.h

#import "dataClass.h"

tableViewControll.m

dataClass *test = [dataClass alloc] init; 
test.relImageUrl      //this is nil

我在我的代码中有init和调用函数和类,上面是我正在做的事情,但这就是我所处的情况。
任何帮助将不胜感激

----真正的InCode尝试了解我所读的评论-----
数据源类

the data source class

表视图类

The Table view class where I want to use the array in, I have already included the datasource class

3 个答案:

答案 0 :(得分:0)

请在链接https://github.com/slysid/iOS/tree/master/Tableview中查看项目。我模拟了你需要的东西。我有一个数据源填充在一个外部对象中,用于填充tableview。

我认为问题是你没有初始化你的NSMutable数组并将它分配给你正在创建的对象。在访问它之前,您需要在创建对象之后使用NSMutableArray init和alloc。您可以在数据类init方法中初始化和分配数组,或者编写自定义方法,并在创建数据对象后调用该自定义方法。

方法1: SourceData.m

@implementation SourceData

-(id) init
{
  self = [super init];

    if(self)
    {
       relImageURL = [[NSMutableArray alloc]init];
       [relImageURL addObject:@"FirstRow"];
    }

    return self;

}

在tableviewcontroller中

SourceData *sourceData = [[SourceData alloc]init];
tableData = [NSMutableArray arrayWithArray:[sourceData relImageURL]];
// tabledata is a private variable 

方法2 :(数组的自定义初始化方法)

@implementation SourceData

-(void) initTableSource
{
     relImageURL = [[NSMutableArray alloc]init];
       [relImageURL addObject:@"FirstRow"];
}

在tableviewcontroller中

SourceData *sourceData = [[SourceData alloc]init];
[sourceData initTableSource];
NSLog(@"%@",[sourceData relImageURL])

答案 1 :(得分:0)

首先,除非你正在对你的实例变量(relImageUrl)做一些特别的事情,否则它就不需要了。如果你保留它,请确保你正确地合成它 - 当前的约定是在它前面添加一个下划线(如_relImageUrl)。但同样,你可能根本不需要它。

你没有为relImageUrl展示任何getter / setter,所以假设你没有做任何特别的事情。

您还将您的私有类接口显示为GDAPIhandler,但您将其称为dataClass.h - 这没有任何意义。

如果您在上面请求之前没有实际添加任何元素,如何设置表格视图的项目数?

理想情况下,您的自定义类中有一个NSArray属性,并通过公开来对其进行操作:

  1. 获取物品数量的方法
  2. 提取给定索引的项目的方法
  3. 可能添加/删除项目的方法
  4. 实例化/填充数组的方法 - 但请不要像你要求的那样请求单元格......这种方法不会很好地结束
  5. 所有这些假设您正在尝试使用自定义类来“隐藏”对底层数组的访问。建议你按照这些方法进行重构,以便让自己更容易前进。

    更新

    我刚看到你的屏幕截图为最后一次回复。当您不共享所有相关信息时,不确定您希望人们如何提供帮助。

    如果要在块内分配relImageUrl,则需要在其前面添加__block存储修饰符。此外,不要在块内部引用self,因为它可能导致保留周期。

    所以,你可以尝试类似的东西(在你的函数内但在你输入任何块之前)。

    __weak CustomClass* weakSelf = self;  // don't capture self in block 
    __block NSMutableArray* weakImageUrl = weakSelf.relImageUrl;  
    

    ..尝试这些方面的东西。再两个要点:

    1. 不要在块内引用自我
    2. 对块中需要变异的任何对象使用__block存储修饰符
    3. ...祝你好运......

答案 2 :(得分:0)

使用NSNotificationCenter将数据发布到另一个类

相关问题