簡體   English   中英

僅允許UIView的一個實例出現在情節提要中

[英]Allow only one instance of UIView to appear in Storyboards

我正在使用情節提要創建一個應用,其中第一個屏幕在表視圖中具有歌曲列表,並且我希望將該歌曲傳遞到下一個視圖(我們稱其為音樂播放器)。 我可以做到這一點,但是我還需要音樂播放器在播放音樂時跟蹤各種運動統計數據。

問題是,如果我進入音樂播放器,返回到歌曲列表視圖,然后再次選擇一個單元,它將創建音樂播放器的全新實例。 這是有問題的,因為它創建了一個新計時器,並且我丟失了所有的運動統計信息。 我還發現原始音樂播放器實例仍然存在,因為計時器繼續觸發。

我有什么辦法確保音樂播放器的一個實例繼續出現?

這是我當前的代碼(按執行順序):

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        self.nextScreen = [segue destinationViewController];
    }

^這會將下一個屏幕存儲為成員變量。 我必須這樣做,因為prepareForSeque:didSelectRowAtIndexPath:之前被調用,並且我需要在下一個視圖上設置數據。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    self.nextScreen.currentSong = [self.allSongs objectAtIndex:indexPath.row];
}

^這只是設定歌曲。

然后,根據需要在viewDidLoad:設置下一個視圖。

有解決這個問題的技巧嗎? 如果沒有,我對此有何建議? 我在想一種解決方法是我必須設置某種單例,我不確定這是否是最好的選擇,因為我需要經常重置數據。

謝謝!

您無法使用segues執行此操作。 Segues(除unwind segues外)總是在執行時創建新實例。 您可以推送到新的控制器(假設您將其嵌入導航控制器中),並且在執行此操作的方法中,只有在第一次時才創建一個新實例。

-(IBAction)goToNext {

    if (! self.next){
        self.next = [[NextViewController alloc] init];
        self.next.whateverProperty = whatever you want to pass;
        self.next.delegate = self; // set the delegate here if you're using delegation to send info back to this controller
    }
    [self.navigationController pushViewController:next animated:YES];
}

如果需要,您仍然可以在情節提要中設置控制器,只是不要將它們連接在一起。 在這種情況下,您可以使用以下實例化它們,而不是使用alloc init:

self.next = [self.storyboard instantiateViewControllerWithIdentifier:@"next"];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM