2017-06-22 12 views
5

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 hala prepareForSegue 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

  1. benim iPad üzerinde test beklendiği gibi çalışır - yani, ana ve detay iki kez gösterilmiştir oluşturulduğunda ortaya çıkar.
  2. 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}

  1. ayrıntılı ekran ana görünümü gösterilir
  2. (popToRootViewController başına) kaybolur, vurgulanan doğru sıra ile ("Master'a" diyerek NSLog dahil)
  3. İş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 en application(: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) 
    } 
} 
+0

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

+0

@Dale - "Gönderme {performSegue}" öncesindeki "self.isViewLoaded" değeri true'dur. – AgRizzo

+0

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

cevap

3

segue için bu kodu eklendi benim kendi uygulaması, segue kullanmıyor, ancak hala bölünmüş görünümler kullanıyor. Kodu kontrol ettiğimde, çalışmasını sağlamak için 200 ms gecikme eklemem gerektiğini gördüm. Hiçbir zaman ana nedene ulaşmadım, ancak ayrıntı ekranı zaten görüntüleniyorsa bir gönderim eşzamanlaması çalışmadığında bile gecikme yok