我有一个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
数组时,它打印出它的字符串。这是什么原因?谢谢你的帮助!
答案 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。
祝你好运!