1

我对 Objective-C(和一般的 C)和 iPhone 开发非常陌生,并且来自 java 岛,所以有一些基础知识对我来说很难学习。

我正在深入研究 iOS5 并想使用故事板。

现在我正在尝试在一个列表中设置一个列表,该列表UITableViewController将填充未来 Web 服务返回的值。现在,我只想生成一些模拟对象并在列表中显示它们的名称以便能够继续。

来自 java,我的第一种方法是创建一个新的类,它提供一个全局可访问的方法来为我的列表生成一些对象:

#import <Foundation/Foundation.h>

@interface MockObjectGenerator : NSObject

+(NSMutableArray *) createAndGetMockProjects;

@end

实施是...

#import "MockObjectGenerator.h"

// Custom object with some fields    
#import "Project.h"

@implementation MockObjectGenerator

+ (NSMutableArray *) createAndGetMockObjects {

    NSMutableArray *mockProjects = [NSMutableArray alloc];

    Project *project1 = [Project alloc];
    Project *project2 = [Project alloc];
    Project *project3 = [Project alloc];

    project1.name = @"Project 1";
    project2.name = @"Project 2";
    project3.name = @"Project 3";

    [mockProjects addObject:project1];
    [mockProjects addObject:project2];
    [mockProjects addObject:project3];

    // missed to copy this line on initial question commit
    return mockObjects;

}

这是我的 ProjectTable.h 应该控制我的 ListView

#import <UIKit/UIKit.h>

@interface ProjectsTable : UITableViewController

@property (strong, nonatomic) NSMutableArray *projectsList;

@end

最后是 ProjectTable.m

#import "ProjectsTable.h"
#import "Project.h"
#import "MockObjectGenerator.h"

@interface ProjectsTable {

@synthesize projectsList = _projectsList;

-(id)initWithStyle:(UITableViewStyle:style {

    self = [super initWithStyle:style];

    if (self) {

        _projectsList = [[MockObjectGenerator createAndGetMockObjects] copy];

    }

    return self;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // only one section for all
    return 1;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    NSLog(@"%d entries in list", _projectsList.count);
    return _projectsList.count;

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

    // the identifier of the lists prototype cell is set to this string value
    static NSString *CellIdentifier = @"projectCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    Project *project = [_projectsList objectAtIndex:indexPath.row];

    cell.textLabel.text = project.name

    return cell;
}

因此,虽然我认为一切都已正确设置,但我希望 tableView 在其行中显示我的三个模拟对象。但它保持为空,并且该NSLog方法将“列表中的 0 个条目”打印到控制台中。那么我做错了什么?

任何帮助表示赞赏。

最好的问候菲利克斯

更新 1:错过了将两个 return 语句复制到这个框(“return mockObjects”和“return cell”)中,它们已经在我的代码中,现在插入。

4

3 回答 3

1

你不见了

return mockProjects;

在你的方法中

+ (NSMutableArray *) createAndGetMockObjects {

编辑

此外,就像其他人指出的那样,您需要确保调用init您正在分配的所有对象。简单地分配它并不会初始化对象,在你这样做之前你不能真正使用它

于 2012-06-28T15:03:06.047 回答
1

您的代码中至少有两个问题:

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

你应该返回一个有效的UITableViewCell(只是return cell;

您还应该初始化您分配的对象:

NSMutableArray *mockProjects = [NSMutableArray alloc];

Project *project1 = [Project alloc];
Project *project2 = [Project alloc];
Project *project3 = [Project alloc];

为此,请为对象编写mockProjects = [[NSMutableArray alloc]init];相同的内容。Project

在该方法中,您还需要返回您创建的对象:return mockProjects;

我强烈建议你检查一下自动引用计数系统,或者尝试学习 iOS 的老式内存管理模型。它与 Java 的做事方式非常不同。

于 2012-06-28T15:05:10.003 回答
0

第一:总是调用allocandinit来创建一个对象。第二:您不会在类方法中返回可变数组。return mockProjects;在末尾添加声明

于 2012-06-28T15:04:33.483 回答