0

我正在構建一個在TabBarController上加載5個項目的iPhone應用程序。可可觸摸Objective-C:如何調用兩次相同的ViewController?

當應用程序加載的第一個觀點是音頻播放器

(的MyAudioPlayerViewController一個實例)假設用戶開始播放一首歌曲MyAudioPlayerViewController,然後決定輕按第二標籤欄項目,其中有6個選項在UITableView可供選擇。用戶做出選擇,導致另一個UITableView(有一些其他選項可供選擇),然後他們做出另一個選擇,導致最終的ViewController,這也是一個音頻播放器。

我需要這最後的UIViewController是SAME作爲第一個MyAudioPlayerViewController是有inicial歌曲播放和一個新的實例。

爲什麼我需要這種配置?我需要它,因爲在用戶在前一個UITableView上進行最終選擇的那一刻,正在播放的歌曲必須停止

具有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類(播放器本身)上的方法負責停止正在播放的以前的音頻,因爲它受到保護。

有沒有這種情況下的解決方案,或者我應該使用另一種方法再次構建一切?

謝謝!

回答

1

您需要能夠從其他類中引用MyAudioPlayerViewController實例。如果你喜歡,你可以通過你的應用代理來完成。

如果您的標籤欄控制器使用Interface Builder進行設置,請在您的MyAudioPlayerViewController的應用程序委託中創建一個IBOutlet,並將其掛接到Interface Builder中的MyAudioPlayerViewController。

如果您在代碼中設置標籤欄控制器,只需分配/初始化實例變量並將其設置爲您的第一個選項卡。

您需要設置其屬性或創建一個存取方法,以便您可以從其他類訪問它。

要設置屬性,打開你的應用程序代理的.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

+0

非常感謝Thomas幫助我,Thomas!我正在使用Interface Builder,並在我的AppDelegate上創建了IBOutlet並將它連接到IB上。我如何創建訪問器方法?我收到警告:找不到方法myAudioPlayerViewController ... – Winston 2011-06-16 19:49:31

+0

@Winston我已經添加了有關創建上述屬性的信息。它會爲你創建訪問器方法。 – thomashw 2011-06-16 20:15:40

+0

謝謝托馬斯,你幫了我很多!我試過了,再次收到警告說沒有找到該方法。我不知道爲什麼。謝謝! – Winston 2011-06-16 20:33:58

2

由於他們是標籤欄控制器的一部分,說你的實例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實例。然後,我們將當前選項卡移到指向我們的音樂播放器,然後再次彈出到該導航控制器中的根視圖控制器,以便用戶下一次重新開始播放。根據需要修改此行爲。

+0

我正在嘗試這個,並會讓你事情發生。謝謝迪帕克! – Winston 2011-06-16 19:54:49

+0

由於我使用UINavigation控制器推UITableViews,我得到[UINavigationController changeText:withSong:]:無法識別的選擇發送到實例0x480620。我應該改變什麼? – Winston 2011-06-16 20:04:17

+0

音頻播放器在哪個選項卡中?它是否也被推入「UINavigationController」? – 2011-06-16 20:06:55

1

爲什麼我需要這種配置? I 需要它,因爲在 這個時刻,用戶在他的最後一個UITableView 上選擇了最後的 正在播放的歌曲必須停止。

一個簡單的方法是讓播放音頻的任何對象在開始播放之前播放通知,並觀察來自任何其他對象的相同通知。如果音頻播放器得到這樣的通知,它應該停止它當前正在播放的任何聲音。

這樣,您可以擁有儘可能多的音頻播放器控制器,而不需要彼此相處,但他們都不需要知道其他任何人。

+0

我有一個通知中心設置。我會考慮一下。非常感謝! – Winston 2011-06-16 21:41:04