1

Я пытаюсь добавить проигрывателя в свою камеру.Ошибка MPMoviePlayer в ячейках таблицы

Код:

- (MPMoviePlayerViewController*)setUp 
{ 
    MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:url]; 

//.. setting frame etc 
//not starting the player; no fancy set up, everything default. 

    return player; 
} 

В cellForRowAtIndexPath:

if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
     cell.tag = indexPath.row; 

     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul); 
     dispatch_async(queue, ^(void) 
     { 
      MPMoviePlayerViewController *player = [self setUp]; 
      if (player) 
      { 
       dispatch_async(dispatch_get_main_queue(),^
       { 
        if (cell.tag == indexPath.row) 
        { 
         [cell.contentView addSubview:player.view]; 
         [cell setNeedsLayout]; 
        } 
       }); 
      } 
     }); 
    } 

Если я добавил его только лишь клетки, нет никаких проблем, если я добавил его к более чем одному скажем 10 или 20 , Я всегда получаю этот крах.

Ошибка:

* Assertion failure in -[MPMoviePlayerControllerNew _moviePlayerDidBecomeActiveNotification:], /SourceCache/MediaPlayer_Sim/MobileMusicPlayer-2526.83/SDK/MPMoviePlayerController.m:1351

* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'movie player has wrong activation state (1)'

Полный след:

0 CoreFoundation 0x01dcf1e4 __exceptionPreprocess + 180

1 libobjc.A.dylib 0x0191c8e5 objc_exception_throw + 44

2 CoreFoundation
0x01dcf048 +[NSException raise:format:arguments:] + 136

3 Foundation 0x014fc4de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
4 MediaPlayer 0x00017450 -[MPMoviePlayerControllerNew _moviePlayerDidBecomeActiveNotification:] + 235
5 Foundation 0x015ef049 57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke + 40
6 CoreFoundation 0x01e2af04 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER
+ 20
7 CoreFoundation 0x01d82efb _CFXNotificationPost + 2859
8 Foundation 0x01528e41 -[NSNotificationCenter postNotificationName:object:userInfo:] + 98
9 MediaPlayer 0x0001a085 -[MPMoviePlayerControllerNew _postNotificationName:object:userInfo:] + 133
10 MediaPlayer 0x00019ff1 -[MPMoviePlayerControllerNew _postNotificationName:object:] + 67
11 MediaPlayer 0x000197b2 -[MPMoviePlayerControllerNew _ensureActive] + 199
12 MediaPlayer 0x00014962 -[MPMoviePlayerControllerNew prepareToPlay] + 85
13 MediaPlayer 0x00012ccd -[MPMoviePlayerController prepareToPlay] + 42
14 MediaPlayer 0x00082c77 -[MPMoviePlayerViewController loadView] + 335
15 UIKit 0x006fb0d3 -[UIViewController loadViewIfRequired] + 78
16 UIKit 0x006fb5d9 -[UIViewController view] + 35
17 MyTableView 0x0000381f -[MyTableViewTableViewController prepareStreams] + 159
18 MyTableView 0x00004115 __72-[MyTableViewTableViewController tableView:cellForRowAtIndexPath:]_block_invoke + 53 19 libdispatch.dylib 0x044c17b8 _dispatch_call_block_and_release + 15
20 libdispatch.dylib 0x044d64d0 _dispatch_client_callout + 14
21 libdispatch.dylib
0x044c4eb7 _dispatch_root_queue_drain + 291
22 libdispatch.dylib 0x044c5127 _dispatch_worker_thread2 + 39
23 libsystem_pthread.dylib 0x04805dab _pthread_wqthread + 336
24 libsystem_pthread.dylib 0x04809cce start_wqthread + 30 ) libc++abi.dylib: terminating with uncaught exception of type NSException

Я перепробовал все решения я мог бы найти на SO, но ни один не работает. Я даже не запускаю игрока в клетках. Принимал меня часами. Начался как забавный проект, который оказался головной болью. Но мне очень нравится знать, почему и что здесь не так.

ответ

0

Включите ниже две строки внутри основной очереди: -

dispatch_async(dispatch_get_main_queue,()^{ 

    MPMoviePlayerViewController *player = [self 
    setUp]; 
     if (player) 
     { 
+0

Спасибо за ответ; помогите объяснить, почему? Похоже, что это превосходит цель использования 'async', если я помещаю все в основную очередь. – Unheilig

0

Не делать то, что вы делаете - вы не рециркуляция контроллера Movie Player. Другой ответ здесь не собирается решать вашу проблему, он просто скрывает его, заставляя вас запускать все в главной очереди.

В настоящее время каждый раз, когда ваше приложение запрашивает ячейку, вы создаете новый экземпляр MPMoviePlayerViewController. Это плохо, потому что он побеждает цель UITableView, которая должна перерабатывать его виды. Вместо этого вы должны создать подкласс UITableViewCell с контроллером видеопроигрывателя внутри него. Таким образом, вам нужно создать экземпляр только один раз, и не каждый раз, когда ячейка прокручивается на экран. Ваш нынешний подход действительно неэффективен и приведет к различным видам плохого поведения.

Другой предмет, на который вы, вероятно, должны смотреть, - это сам класс - вы используете MPMoviePlayerViewController, но этот класс специально предназначен для представления в виде контроллера вида в полноэкранном режиме. Если вы встраиваете его в ячейку просмотра таблицы, вы не должны его использовать. Вместо этого вы должны использовать MPMoviePlayerController и встроить его представление в свой вид таблицы.

+0

Я пробовал то, что вы предложили здесь; Я использую 'MPMoviePlayerController', но на нем нет никаких элементов управления, а только черный экран, прежде чем появилась кнопка воспроизведения с' MPMoviePlayerViewController'. Благодарю. – Unheilig

Смежные вопросы