2014-03-19 23 views
0

我有一個iOS應用程序現在在3視圖控制器故事板運行。第一個(初始視圖)具有播放按鈕以啓動音樂流和用於當前播放歌曲的專輯封面的圖像。這個場景有一個導航控制器和一個酒吧按鈕,它將引導用戶到下一個視圖...保存或返回到以前的iOS場景

列表視圖填充硬編碼流,用戶可以選擇。非常簡單,工作仍然很好。

選擇一個後,用戶進入一個預覽頁面,在它開始播放之前告訴他們關於該流的信息。仍然像一個魅力工作,直到他們想從這裏繼續。

如果用戶從預覽頁面中選擇了流,應用程序「應該」將用戶返回到初始ViewController並交換出所選的播放流。起初,我錯誤地創建了一個初始viewController的新實例,在修復了這個錯誤之後,現在有更多的問題可以由某人幫助我解決。

這裏是按鈕的IBAction爲選擇流:

- (IBAction)returnHome:(id)sender 
{ 
    [[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack 
} 

之前發現這個邏輯,我用的是prepareForSegue並設定目的地的流值要選擇什麼。我還試圖保存第一個視圖的狀態,但由於我正在移動3個ViewControllers並使用模式segue,因此不確定如何將它傳遞給下一行(或保留它),因此如果他們選擇不選擇一個新的流。

任何建議將有所幫助,但請不要簡單地發佈鏈接到參考。我一直在那裏呆了3天,他們在iOS參考文檔中不會說出非常初學者友好的語言。

回答

2

你希望能夠通知你的第一個VC用戶改變了軌道? 您可以簡單地使用NSNotificationCenter。

首先你必須「調入」,即在viewDidLoad中,您的視圖控制器來聽特別通知:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeStream:) name:@"UserWantToChangeStream" object:nil]; 
} 

和實現方法:

- (void)changeStream:(NSNotification *)notification 
{   
    NSString *newStreamName = notification.object; 
    /* Change the stream code */ 
} 

不要忘記停止聽通知:

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

然後你用戶執行操作後發佈通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"UserWantToChangeStream" object:@"new_stream_name"]; 

在示例中,我傳遞NSString new_stream_name,但可以傳遞任何對象。

您的第一個視圖控制器將被通知。

0

我已經想出了至少如何讓它工作。我在故事板中添加了第二個導航控制器,刪除後成功返回了2個視圖,而不是一個。

這是我保留流數據並將其帶回初始視圖控制器的邏輯,如果任何人都好奇。

- (IBAction)returnHome:(id)sender 
{ 
    ViewController *vc = (ViewController *)[self.navigationController.viewControllers objectAtIndex:0]; 
    [vc.audioplayer pause]; 
    vc.stream = self.stream; 
    [self.navigationController popToRootViewControllerAnimated:YES]; 
} 

因爲我現在只有一個導航控制器,用於初始的索引將是0。我可以抓住的初始視圖,並把對它的引用在vc。

然後,我只需從中訪問音頻播放器,如果它仍在播放,請停止播放並加載場景。

然後在初始ViewController邏輯中,我有viewDidAppear方法將新的流選擇加載到顯示標籤和圖像中。

- (void)viewDidAppear:(BOOL)animated 
{ 
    // If there is no stream selected (first run) 
    // set the stream to RAPstation default 
    if (self.stream == nil) 
    { 
     self.stream = [[Stream alloc]initWithName:@"RAPstation" ...]; 
    } 

    self.snameLabel.text = self.stream.sName; 
    self.sdescLabel.text = self.stream.sDesc; 
} 

不知道這是否正確,但現在肯定有效。如果任何人都可以幫助使它更清潔,請隨時免費。

1

您是否考慮過展開segues的用法?他們對理解和使用有點棘手,但他們肯定能幫助你。

首先,你必須在你的FIRST視圖控制器上創建一個IBAction(==你想要「登陸」並將你的列表選擇傳遞給的視圖控制器),這需要UIStoryboardSegue作爲單個參數,並將實現留空。例如

- (IBAction) returnToHome:(UIStoryboardSegue*) segue{;} 

然後,在預覽頁面視圖控制器(在情節串連圖板),從按鈕的小出口符號在下部(其triggerng彈出導航控制器的IBAction爲一個)拖動SEGUE視圖控制器的右側。應該彈出一個菜單,詢問returnToHome方法。從按鈕中刪除以前的IBAction(您稱之爲-(IBAction)returnHome:(id)sender

這樣,您應該可以像以前一樣做事(回彈到根視圖控制器)而不解決問題但是!如果您在最後一個視圖控制器中實現了prepareForSegue:sender的覆蓋,那麼您將擁有對根視圖控制器的引用,您可以在其中執行任何所需的操作。

- (void) prepareForSegue:(UIStoryboardSegue*) segue sender:(id)sender 
{ 
    ViewController *vc = (ViewController *)segue.destinationViewController; 
    [vc.audioplayer pause]; 
    vc.stream = self.stream; 
} 

這是爲了達到同樣的效果更清潔的方式,因爲你不是在你的viewcontrollers層次進行assumpions(如果明天你會之前,第一個添加其他視圖控制器?該應用程序一定會崩潰)。順便說一句,如果你進入Storyboard/Segue業務,請查看我的庫,當涉及到「傳遞參數」時,它真的簡化了故事板工作:https://github.com/stefanomondino/SMQuickSegue(您可以通過帶有'SMQuickSegue'的cocoapods進行安裝)

相關問題