Какао Touch Objective-C: Как вызвать один и тот же ViewController дважды? - PullRequest
0 голосов
/ 16 июня 2011

Я создаю приложение для iPhone, которое загружает 5 элементов в TabBarController.

Когда приложение загружает первый вид, это аудиоплеер (экземпляр MyAudioPlayerViewController )

Предположим, что пользователь начинает воспроизведение песни на MyAudioPlayerViewController , а затем решает нажать на второй элемент панели вкладок , который имеет 6 опций для UITableView выбирать из.Пользователь делает выбор, который приводит к другому UITableView (с некоторыми другими вариантами выбора), затем он делает другой выбор, приводя к конечному ViewController, который также является аудиоплеером.

Мне это нужнопоследний UIViewController должен быть ЖЕ как первый, у которого была воспроизведена начальная песня, и NOT новый экземпляр MyAudioPlayerViewController .

ПочемуМне нужна эта конфигурация?Мне это нужно, потому что в тот самый момент, когда пользователь делает свой последний выбор в предыдущем UITableView, песню, которая воспроизводится MUST STOP .

Этот окончательный вид, имеющий MyAudioPlayerViewController, должен иметь доступМой пользовательский класс NSObject, который воспроизводит аудио, заставляя его остановить текущую песню.

Прямо сейчас у меня есть этот код, который вызывает MyAudioPlayerViewController, который показывает окончательный UIViewController:

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

{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    MyAudioPlayerViewController * myAudioPlayerViewController = [[MyAudioPlayerViewController alloc] initWithNibName:@"MyAudioPlayerViewController" bundle:nil];
    [self.navigationController pushViewController:myAudioPlayerViewController animated:YES];   
    [myAudioPlayerViewController changeText:[arraySingerList objectAtIndex:indexPath.row] withSong:[arraySongList objectAtIndex:indexPath.row]];    
    [myAudioPlayerViewController release];    
} 

Как вывидно, что он создает новый экземпляр MyAudioPlayerViewController, который не имеет ничего общего с самым первым при запуске приложения, а затем я могу вызвать метод в моем пользовательском классе NSObject (сам проигрыватель), ответственный за остановку предыдущего аудио, котороеиграет, потому что это защищено.

Есть ли какое-то решение для этого случая, или я должен построить все заново, используя другой подход?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

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

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    MyAudioPlayerViewController * myAudioPlayerViewController = nil;
    for ( UIViewController * viewController in self.tabBarController.viewControllers ) {
        if ( [viewController isMemberOfClass:[MyAudioPlayerViewController class]] ) {
            myAudioPlayerViewController = (MyAudioPlayerViewController *)viewController;
        }
    }

    if ( !myAudioPlayerViewController ) {
        NSLog(@"Couldn't retrieve player");
    }

    [myAudioPlayerViewController changeText:[arraySingerList objectAtIndex:indexPath.row] withSong:[arraySongList objectAtIndex:indexPath.row]];
    self.tabBarController.selectedIndex = 0;
    [self.navigationController popToRootViewControllerAnimated:YES]; 
}

Здесь мы получаем доступ к первому контроллеру представления в списке контроллеров представления на панели вкладок и вызываем changeText:withSong:, так как это наш экземпляр MyAudioPlayerViewController.Затем мы перемещаем текущую вкладку, чтобы она указывала на наш музыкальный проигрыватель, а затем подключаемся к корневому контроллеру представления в этом навигационном контроллере, как в следующий раз, когда пользователь сможет начать заново.Измените это поведение, как вы хотите.

1 голос
/ 17 июня 2011

Зачем мне нужна эта конфигурация? я нужно, потому что в тот самый момент что пользователь делает свой окончательный выбор на предыдущем UITableView песня, которая играет, ДОЛЖНА ОСТАНОВИТЬ.

Простой способ сделать это состоит в том, чтобы любые объекты, которые воспроизводят аудио, публиковали уведомление до того, как они начали воспроизведение, а также наблюдали за тем же уведомлением, исходящим от любого другого объекта. Если аудиоплеер получает такое уведомление, он должен остановить любые звуки, которые он воспроизводит в данный момент.

Таким образом, вы можете иметь столько контроллеров аудиоплеера, сколько захотите, не мешая друг другу, но никто из них не должен знать ни о каких других.

1 голос
/ 16 июня 2011

Вы должны иметь возможность ссылаться на экземпляр MyAudioPlayerViewController из других ваших классов. Вы можете сделать это через своего делегата приложения, если хотите.

Если ваш контроллер панели вкладок настроен с использованием Interface Builder, создайте IBOutlet в своем приложении-делегате класса MyAudioPlayerViewController и подключите его к MyAudioPlayerViewController в Interface Builder.

Если вы настраиваете контроллер панели вкладок в коде, просто выделите / инициализируйте переменную экземпляра и установите ее в качестве первой вкладки.

Вам нужно будет либо установить его свойства, либо создать метод доступа, чтобы вы могли получить к нему доступ из других классов.

Чтобы настроить свойство, откройте файл .h делегата приложения и добавьте следующее:

@property (nonatomic, retain) IBOutlet MyAudioPlayerViewController *myAudioPlayerViewController;

и в вашем приложении .m файл добавьте это:

@synthesize myAudioPlayerViewController;

Тогда:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    YourAppDelegate *yourAppDelegate = (YourAppDelegate *)[UIApplication sharedApplication] delegate];
    MyAudioPlayerViewController * myAudioPlayerViewController = [yourAppDelegate myAudioPlayerViewController];
    [self.navigationController pushViewController:myAudioPlayerViewController animated:YES];   
    [myAudioPlayerViewController release];    
} 

Для получения дополнительной информации о свойствах в Objective-C: http://cocoacast.com/?q=node/103

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...