簡體   English   中英

檢查哪個ViewController做了選擇(從目標ViewController)

[英]Check which ViewController made a segue (from the destination ViewController)

我有一個代碼,可以給我的12個ViewController隨機選擇。

在ViewController1中,它看起來像這樣;

let segues = ["1-2", "1-3", "1-4", "1-5", "1-6", "1-7", "1-8", "1-9", "1-10", "1-11", "1-12"]
        let index = Int(arc4random_uniform(UInt32(segues.count)))
        let segueName = segues[index]
        self.performSegueWithIdentifier(segueName, sender: self)

並且在ViewController 2中看起來相同,但是segue名稱更改為;

let segues = ["2-1", "2-3", "2-4", "2-5", "2-6", "2-7", "2-8", "2-9", "2-10", "2-11", "2-12"]

"1"變為"2" )-對於所有12個ViewController依此類推。

現在,我想做的是刪除已經顯示的ViewController,以便下一個序列不會回到任何以前的ViewController。

例:

•ViewController1對ViewController2( "1-2" )進行排序

•ViewController2從數組segues刪除segues "2-1"

•然后,ViewController2對ViewController3 "1-3"

•ViewController3刪除序列"3-1""3-2"

等等...

我強烈懷疑您的主邏輯可能SegueCoordinator得更易於管理,但是使用當前設置,我建議您使用一個單獨的SegueCoordinator來交付下一個segue,直到用完為止( SegueCoordinator 6,6-4 ...)等:

import GameplayKit

class SegueCoordinator {
    private var numberOfViewControllers = 0
    private var segues = [String]()

    init(numberOfViewControllers: Int) {
        self.numberOfViewControllers = numberOfViewControllers
        setupSegues()
    }

    func nextSegue() -> String? {
        let segue = segues.first
        segues.removeFirst()
        return segue
    }

    private func setupSegues() {
        let allIds = Array(1...numberOfViewControllers)
        var shuffleIds = GKRandomSource().arrayByShufflingObjectsInArray(allIds) as! [Int]
        while shuffleIds.count > 1 {
            let availableIds = shuffleIds.filter{$0 != shuffleIds.first!}
            let segue = "\(shuffleIds.first!)-\(availableIds.first!)"
            segues.append(segue)
            shuffleIds.removeFirst()
        }
    }
} 

然后,您將從想要開始的任何let coordinator = SegueCoordinator(numberOfViewControllers: 12)創建協調器: let coordinator = SegueCoordinator(numberOfViewControllers: 12) (可以很容易地更改為從協調器本身中選擇一個隨機的firstControler)。

然后只需向協調員詢問下一個Segue:

let segue = coordinator.nextSegue()

將協調器傳遞給prepareForSegue中的nextVC。

這是一種實現方法:

  1. 將訪問過的viewController數組作為一個屬性保存在每個viewController中。 我們稱此為已visited 另外,創建一個名為TracksVisited協議 ,您所有的viewController都將采用:

     protocol TracksVisited { var visited: [Int] { get set } } class ViewController1: UIViewController, TracksVisited { var visited = [Int]() ... } class ViewController2: UIViewController, TracksVisited { var visited = [Int]() ... } 
  2. 將當前的viewController號添加到此列表中:

     let vc = 3 // current viewController visited.append(vc) 
  3. 生成segues列表並選擇一個:

     // generate list of all viewControllers let all = Array(1...12) // remove visited from all let rest = all.filter { !visited.contains($0) } // create list of segues let segues = rest.map { "\\(vc)-\\($0)" } // choose random segue and go there let index = Int(arc4random_uniform(UInt32(segues.count))) let segueName = segues[index] self.performSegueWithIdentifier(segueName, sender: self) 
  4. prepareForSegue ,將visited列表傳遞到目標viewController:

     if let destinationViewController = segue.destinationViewController as? TracksVisited { destinationViewController.visited = visited } 

暫無
暫無

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

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