performSegue
çağrıldığında uygulamanız her zaman bir sonraki görünüm denetleyicisine düşmez. Ancak, her zaman prepare(for:sender)
'u hemen yürütür.performSegue her zaman geçiş yapmaz, ancak (gönderen için) hazırla (her zaman):
- bir
performSegue
sert hata kalmadan çalışmaya (ve halaprepareForSegue
yürütmek için) değil için hangi nedenler vardır? - Kaynak görüntüleme denetleyicisinin denetlemem gereken bir düzeyde olması gereken belirli bir durum var mı?
- 10 saniyelik bir gecikme koyarsam (
asyncAfter
aracılığıyla) segue oluşur.
Senaryo
Ben yeni bir özellik için bir çalışma segue amaca uygun hale çalışıyorum (Gündem arama entegrasyonu.) Geçiş benim iPhone'da oluşmaz uygulama detay üzerinde bırakılırsa görünüm. (Uygulama, kök görünümü denetleyicisi gibi bir UISplitViewController sahiptir.)
Ancak, kod
- benim iPad üzerinde test beklendiği gibi çalışır - yani, ana ve detay iki kez gösterilmiştir oluşturulduğunda ortaya çıkar.
- Uygulamayı ana görünümde bıraktığımda iPhone'umu test ediyorum. I ayrıntılı ekranından benim iPhone sınamak
{aşağıdaki kodu bakınız}
- ayrıntılı ekran ana görünümü gösterilir
- (
popToRootViewController
başına) kaybolur, vurgulanan doğru sıra ile ("Master'a" diyerek NSLog dahil) - İşlev,
prepare(for:sender)
dahil olmak üzere yürütülür, ancak ayrıntı görünümü hiçbir zaman gösterilmez. Bu noktada
, ben uygun satır dokunabilirsiniz ve beklendiği gibi segue oluşur - o tableView(:didSelectRowAt:)
çağrılar performSegue
olduğunu.
bile fazla Detay
Swift 3.0 & iOS 10
app onun rootViewController olarak UISplitViewController sahiptir. Ana görünüm, tariflerin bir listesi olan bir tablodur. Detay görünümü, seçilen tarifin içindekileri listeleyen bir tablodur. Segue, reçete satırı seçiminden, bileşen tablosuna geçiş yapar.
Yeni bir özellik ekliyorum: Kullanıcıların aramasını ve seçtiğinde tarifin ana görünümden seçilmesi ve bileşenlerinin ayrıntı görünümünde gösterilmesi için yemek tariflerinin Spotlight'a getirilmesi.
Şimdi AppDelegate enapplication(:continue:restorationHandler)
aracılığıyla Spotlight arama entegrasyonu uygulamak çalışıyorum:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
guard userActivity.activityType == CSSearchableItemActionType,
let userInfo = userActivity.userInfo,
let id = userInfo[CSSearchableItemActivityIdentifier] as? String
else {
return false
}
// The id is a unique identifier for recipe.
if let inputRecipe = Recipe.getBy(uuid: id, moc: self.managedObjectContext) {
let root = self.window?.rootViewController as! UISplitViewController
let nav = root.viewControllers[0] as! UINavigationController
// If this is a navigation controller, then detail is being shown
if (nav.topViewController as? UINavigationController) != nil {
NSLog("Should be a detail view")
nav.popToRootViewController(animated: true)
}
if let masterVC = nav.topViewController as? RecipeMasterVC {
NSLog("Into the master")
masterVC.selectTableRowAt(recipe: inputRecipe)
}
}
return true
}
RecipeMasterVC içinde, ben de benzer bir senaryo var
func selectTableRowAt(recipe: Recipe){
let indexPath = self.fetchedResultsController.indexPath(forObject: recipe)
self.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .top)
DispatchQueue.main.async {
self.performSegue(withIdentifier: seguesEnum.RecipeDetail.rawValue, sender: recipe)
}
}
Ana görünüm denetleyicisi henüz yüklenmemiş olabilir. Görünüm denetleyicinin var olması mümkün - bu, bölünmüş görüntü denetleyicisinin referans göstermesi için init() çağrıldı, ancak viewDidLoad() çağrılmadı. ViewDidLoad() 'da bazı hata ayıklama kodlarını eklemeyi deneyin veya ana görünüm gerçekten yüklendiğinde izleme için selectTableRow içinde isViewLoaded yöntemini kontrol edin. – Dale
@Dale - "Gönderme {performSegue}" öncesindeki "self.isViewLoaded" değeri true'dur. – AgRizzo
Kendi uygulamamda benzer bir senaryo var, segue kullanmıyor, ancak hala bölünmüş görünüm kullanıyor. Kodu kontrol ettiğimde, çalışmasını sağlamak için 200 ms gecikme eklemem gerektiğini gördüm. Asıl neden hiç bir zaman kötüye gitmedi, ama bir gecikme bile olsa, detay ekranı zaten görüntüleniyorsa bir zamanlama uyuşmaz bile çalışmıyor – Dale