索引0超出了边界[0 .. 0],但不是空数组

时间:2012-07-16 07:55:05

标签: iphone xcode nsarray nsurl nslog

我有一个UITableView用于我正在制作的将展示电影预告片的应用。

在我的RootViewController.h文件中,我有这段代码(这里提供了所需的所有相关代码):

@interface RootViewController : UITableViewController {
    NSMutableArray *listOfLinks;
}

在我的.m中是这段代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    listOfLinks = [[NSMutableArray alloc] init];
    NSURL *myurl2 = [NSURL URLWithString:@"http://website.com/movietrailers.plist"];
    NSDictionary *plistDict2 = [NSDictionary dictionaryWithContentsOfURL:myurl2];
    NSArray *plistArray2 = [plistDict2 objectForKey:@"MovieLinks"];
    NSDictionary *dic = [NSDictionary dictionaryWithObject:plistArray2 forKey:@"MovieLinks"];
    [listOfLinks addObject:dic];
    NSLog(@"%@", listOfLinks);
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSURL *movieURL = [listOfLinks objectAtIndex:indexPath.row];
    MPMoviePlayerViewController *moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
    [self presentMoviePlayerViewControllerAnimated:moviePlayer];
    [moviePlayer release];
}

我的plist看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>MovieTitles</key>
    <array>
        <string>Movie 1</string>
        <string>Movie 2</string>
    </array>
    <key>MovieLinks</key>
    <array>
        <string>http://trailerserver.com/movie1.mp4</string>
        <string>http://trailerserver.com/movie2.mp4</string>
    </array>
</dict>
</plist>

但我基本上得到listOfLinks为空的错误。错误如下所示:

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

当我NSLog数组时,它打印出它的字符串。这是什么原因?谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

你为一个数组添加了一个字典,现在正试图获得第6个项目,你只有一个。当您记录它时,您会看到您在那里的单个词典的内容。

当你在执行numberOfRowsInSection时,你可能会返回字典的数量,而不是数组,我猜你想要字典,所以你应该有

NSDictionary* d = [listOfLinks objectAtIndex:0];
NSURL *movieURL = [[listOfLinks [d allKeys]] objectAtIndex: indexPath.row];
MPMoviePlayerViewController *moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL]

或沿着这些方向的东西

编辑以获取更新后的问题。

我不确定为什么要将信息存储在字典中。实际上,您从字典中获取元素数组,然后使用它创建字典并将其放入数组中。这毫无意义。

在你去的代码部分:

NSDictionary *plistDict2 = [NSDictionary dictionaryWithContentsOfURL:myurl2];
NSArray *plistArray2 = [plistDict2 objectForKey:@"MovieLinks"];

这会显示你当时有一个数组,所以为什么要这样做:

NSDictionary *dic = [NSDictionary dictionaryWithObject:plistArray2 forKey:@"MovieLinks"];
[listOfLinks addObject:dic];

创建一个字典并将字典放在数组的元素0中?

如果您希望listOfLinks包含您从MovieLinks键获得的链接列表,为什么不将它们直接放入数组?

if(plistArray2 != nil && [plistArray2 count] > 0)
    [listOfLinks addObjectsFromArray:plistArray2];

然后在你的访问者中:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if(section == WHATEVERSECTION)
        return [listOfLinks count];
    return 0;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    NSURL *movieURL = [listOfLinks objectAtIndex:indexPath.row];
    MPMoviePlayerViewController *moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
    [self presentMoviePlayerViewControllerAnimated:moviePlayer];
    [moviePlayer release];
}

答案 1 :(得分:0)

检查表视图的numberOfRowsInSection方法。你在这种方法中返回了什么。在此方法

中写下

 [listOfLinks count] 

答案 2 :(得分:0)

你正在将一个NSDictionary放在listOFLinks中,然后你试图检索一个NSURL,这是错误的。

您需要获取字典内和数组内的URL。

祝你好运!