![](/img/trans.png)
[英]Possible to check segue from which viewcontroller then do something?
[英]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。
這是一種實現方法:
將訪問過的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]() ... }
將當前的viewController號添加到此列表中:
let vc = 3 // current viewController visited.append(vc)
生成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)
在prepareForSegue
,將visited
列表傳遞到目標viewController:
if let destinationViewController = segue.destinationViewController as? TracksVisited { destinationViewController.visited = visited }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.