UITableView numberOfRowsInSection不会加载多行

时间:2012-01-02 22:26:32

标签: objective-c xcode uitableview

所以我有一个UITableView,它应循环遍历单个NSMutableArray并将它们中的每一个用作行标签。目前我可以运行的唯一方法是使用0或1行,2或更高的行抛出错误,表示数组索引已关闭。我尝试使用NSLog来输出我的数组并确认它正在读取所有字符串。

// table methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 2;
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

}

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}

// Set up the cell...
NSString *cellValue = [harvestRecipeList objectAtIndex:indexPath.row];
cell.textLabel.text = cellValue;

return cell;
} 

数组代码存储在我在下面添加的完全相同的文件(MasterViewController.m)中。

- (void)viewDidLoad
{
    [super viewDidLoad];

    harvestRecipeList = [[NSMutableArray alloc] init];

    [harvestRecipeList addObject:@"Ice Cream"];
    [harvestRecipeList addObject:@"Walnut Cake"];
    [harvestRecipeList addObject:@"Cookies"];
    [harvestRecipeList addObject:@"Salad"];
    [harvestRecipeList addObject:@"Grilled Fish"];

    //Set the title
    self.navigationItem.title = @"BTN Recipes";
}

我会喜欢这方面的任何帮助,这一直困扰着我。我正在使用 [harvestRecipeList count] ,但这会引发相同的数组索引错误。正如我所提到的,我可以让应用程序以0或1行完美运行 - 提前感谢任何帮助!

编辑:这是我在构建之后在输出窗口中遇到的错误:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

EDIT2 :包含在我的HarvestRecipeList属性设置下面

//MasterViewController.h
@interface MasterViewController : UITableViewController {
    NSMutableArray *harvestRecipeList;
}
@property (nonatomic, retain) NSMutableArray *harvestRecipeList;

// and also my MasterViewController.m 
@synthesize harvestRecipeList;

EDIT3 这是我为这个项目压缩的源代码。它叫做树屋,现在只是一个测试名称,但你可以dl from my cloudapp here

4 个答案:

答案 0 :(得分:5)

Updated Solution:

所以我检查了你的代码并发现了问题。执行以下操作:

  1. 进入故事板并选择主表视图(单击静态内容的位置)
  2. 点击属性检查器(看起来像向下箭头排序)并将内容从Static Cells更改为Dynamic Prototypes
  3. 单击原型单元格并在标识符字段中键入Cell(这是您用作单元格ID的内容
  4. 同时将附件从None更改为Disclosure Indicator
  5. tableView:numberOfRowsInSection返回self.harvestRecipeList.count
  6. tableView:cellForRowAtIndexPath:中,您可以删除以下两行(由故事板提供):

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

  7. 将您的Push segue从主细胞重新创建到细节视图控制器

  8. 它应该现在一切正常 - 我已经测试过它的工作原理。基本问题是你已经指定了静态单元而不是动态原型,其余的指令只是在扫描。 NSRangeException是由只有一个单元格引起的,因此只显示了所有内容。

    希望这有帮助。

    Previous Solution:
    

    那么,请注意几点,但首先,如果您更新了代码,可以发布更新吗?

    1. 您在harvestRecipeList中添加对象的ViewDidLoad似乎与您合成的harvestRecipeList不同 - 它将是方法的本地,因此您的实例变量将始终为零。你应该总是使用self.harvestRecipeList - 到处都这样做。这可以很容易地解释您的NSRangeException。另见下面的#4。
    2. tableView:numberOfRowsInSection:中,您应该返回self.harvestRecipeList.count
    3. 如果您使用的是iOS5 SDK,则无需检查cell == nil是否dequeueReusableCellWithIdentifier:保证返回非零小区。您需要检查您是否使用的是iOS4 SDK。
    4. 将您的@synthesize harvestRecipeList;更改为@synthesize harvestRecipeList = _harvestRecipeList;,因为这有助于#1并检查您是否正在访问ivar。
    5. 试试#1& #2作为最低要求,然后发布您遇到的问题的最新动态。希望这会有所帮助。

答案 1 :(得分:2)

我检查了您放在ZIP文件中的代码。我立刻注意到你使用了iOS 5 Storyboard功能。我没有Xcode 4和iOS 5 SDK,所以我无法测试你应用程序的那一部分。

但是,我继续手动编写了您的Storyboard部分。我完全测试了您的MasterViewController并发现没有错误。我在AppDelegate这个方法中添加了替换Storyboard自动功能,只显示您认为错误来自的视图控制器。

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    MasterViewController *myVC;
    _window = [[UIWindow alloc] initWithFrame:
               [[UIScreen mainScreen] applicationFrame]];
    myVC = [[MasterViewController alloc] initWithStyle:UITableViewStylePlain];
    [_window setAutoresizesSubviews:YES];
    [_window addSubview:myVC.view];

    [_window makeKeyAndVisible];
    return YES;
}

为了证明您的MasterViewController.m不包含任何错误,我添加了此屏幕截图:

enter image description here

结论:您的错误可以在其他地方找到,可能在您的Storyboard文件中。但是我从未使用过这个新功能,所以我无法帮助你。我建议你查看你的故事板并把所有注意力放在那个文件上。

答案 2 :(得分:1)

好的,如果您的日志消息在尝试查询第二个对象之前显示一个包含五个对象的数组,并且您的应用程序为您提供了NSRangeException,那么您在向我们展示的代码中肯定找不到该错误。

尝试通过在任何-[NSArray objectAtIndex:]之前和之后放置各种日志来查找它,并查看呼叫后未通过的日志。这是你的错误。

请记住,您可以使用

NSLog(@"%s", __PRETTY_FUNCTION__);

显示您记录消息的来源。它们也存在一个行和文件宏,但通常函数宏应该对你有所帮助。

示例:

NSLog(@"%s Before", __PRETTY_FUNCTION__);
[myArray objectAtIndex:anIndex];
NSLog(@"%s After", __PRETTY_FUNCTION__);

如果您的第二条日志消息未通过,那么您将找到错误。

答案 3 :(得分:0)

最好为实例变量使用setter和getter方法。它解决了很多问题。我的猜测是你的问题。因此,您想要使用的任何地方harvestRecipeList都使用self.harvestRecipeList 了解harvestRecipeList

的属性声明是有用的