Bellow i have some code that should play a video once the user has selected the video he wants by name in a uitableview
:
NSLog(@"url %@",[filePathsArray objectAtIndex:indexPath.row]);
NSString *currentFileName = [filePathsArray[indexPath.row] lastPathComponent];
NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [documentsDirectoryPath stringByAppendingPathComponent:currentFileName];
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
//Play the movie now
movieController = [[MPMoviePlayerController alloc] initWithContentURL: fileURL];
[[movieController view] setFrame: [self.view bounds]];
[self.view addSubview: [movieController view]];
[movieController play];
The code should take filePathsArray
which is just the name of the file in my documents directory and of corse i cannot use just a name of a file to play a video it must be a full path. For example i need to get the full path like in the simulator. "/Users/UserName/Library/Application Support/iPhone Simulator/4.3.2/Applications" instead i am getting just the name of the file for example "123.mp4".
The problem with the code is this line:NSString *currentFileName = [filePathsArray[indexPath.row] lastPathComponent];
an once again that is due to just receiving the file name. The problem causes the simulator to crash and i receive this:
Thread 1: EXC_BAD_ACCESS(code=1, address=0xc08384e7)
Can anybody help?
Edit
I placed NSLog(@"row %i - filePathsArray %@", indexPath.row, filePathsArray);
in the - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {}
where my other codes are and i received once again the thread error but i then put the NSLog(@"row %i - filePathsArray %@", indexPath.row, filePathsArray);
in
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{}
and that displayed in the debugger output:
filePathsArray (
"1372954494.023550.mp4",
"1372954525.440379.mp4",
"1372954698.070642.mp4",
"1372954717.124080.mp4",
"1372954881.568860.mp4",
"1372954995.932892.mp4",
"1372955079.400627.mp4",
"1372955121.735828.mp4",
"1372955151.191822.mp4",
"1372955204.253028.mp4",
"1372955317.622774.mp4",
"1372955394.617367.mp4",
"1372955455.130194.mp4",
"1372955748.579562.mp4",
"1372955801.431035.mp4",
"1372955982.626679.mp4",
"1372956220.934516.mp4",
"1372956313.205083.mp4",
"1372956396.179499.mp4",
"1372956433.715887.mp4",
"1372956521.383647.mp4",
"1372956556.635456.mp4",
"1372956865.871915.mp4",
"1372957260.725387.mp4",
"1372957729.062718.mp4",
"1372957817.498707.mp4",
"1372958542.838564.mp4",
"1372958898.002360.mp4",
"1372958944.864006.mp4",
"1372958981.295354.mp4",
"1372959288.333242.mp4",
"1372959511.324370.mp4",
"1372959557.161786.mp4",
"1372959979.054552.mp4",
"1372960381.754023.mp4",
"1372960609.649583.mp4",
"1372964668.874020.mp4",
"1372964985.709783.mp4",
"1372965088.565757.mp4",
"1372965163.876937.mp4",
"1372965296.464444.mp4",
"1373027973.427050.mp4",
"1373028300.018729.mp4",
"1373028402.868729.mp4",
"1373031752.143091.mp4"
)
which are all the correct names of my saved files.
EDIT
Here is my full code:
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if(!filePathsArray)
{
return 0;
}
if ([filePathsArray count] > 0)
return [filePathsArray count];
else
return 0;
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
filePathsArray = [[[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil]mutableCopy];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"row %i - filePathsArray %@", indexPath.row, filePathsArray);
NSString *currentFileName = filePathsArray[indexPath.row];
NSLog(@"url %@",[filePathsArray objectAtIndex:indexPath.row]);
NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES) objectAtIndex:0];
NSString *filePath = [documentsDirectoryPath stringByAppendingPathComponent:currentFileName];
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
//Play the movie now
movieController = [[MPMoviePlayerController alloc] initWithContentURL: fileURL];
[[movieController view] setFrame: [self.view bounds]];
[self.view addSubview: [movieController view]];
[movieController play];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell"];
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil];
NSLog(@"urlstring %@",[filePathsArray objectAtIndex:indexPath.row]);
cell.textLabel.text = [filePathsArray[indexPath.row] lastPathComponent];
return cell;
}
By request, here's the solution:
In the viewDidLoad-method, you have to allocate the array:
filePathsArray = [[NSArray alloc] initWithArray: [[[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil]mutableCopy]];