2017-06-22 19 views
5

performSegue कहलाता है जब मेरा ऐप हमेशा अगले दृश्य नियंत्रक को सीगू नहीं करता है। हालांकि, यह हमेशा prepare(for:sender)तुरंत निष्पादित करता है।performSegue हमेशा संक्रमण नहीं करता है, लेकिन तैयार करने के लिए (प्रेषक के लिए) हमेशा

  • किन वजहों से वहाँ एक performSegue एक कठिन त्रुटि बिना काम करने के लिए नहीं (और अभी भी prepareForSegue निष्पादित करने के लिए) के लिए कर रहे हैं?
  • वहाँ एक निश्चित राज्य है कि स्रोत दृश्य नियंत्रक है कि मैं के लिए जांच करने की आवश्यकता में माना जाता है है?
  • अगर मैं एक 10 सेकंड की देरी डाल (asyncAfter के माध्यम से), segue होता है।

परिदृश्य

मैं अगर एप्लिकेशन विस्तार पर छोड़ दिया है संक्रमण मेरे iPhone पर नहीं होती है फिर से उद्देश्य के लिए एक नई सुविधा के लिए एक काम कर segue कोशिश कर रहा हूँ (स्पॉटलाइट खोज करने के लिए एकीकरण।) राय। (ऐप्स को उसकी जड़ दृश्य नियंत्रक के रूप में एक UISplitViewController है।)

हालांकि, कोड के रूप में जब

  1. मैं अपने आईपैड पर परीक्षण की उम्मीद काम करता है - जैसे कि, दोनों मास्टर और विवरण दृश्य दिखाए जा रहे हैं जब।
  2. जब मैं ऐप को मास्टर व्यू पर छोड़ देता हूं तो मैं अपने आईफोन पर परीक्षण करता हूं।

जब मैं विस्तार स्क्रीन से अपने iPhone का परीक्षण {नीचे कोड देख}:

  1. विस्तार स्क्रीन गायब हो जाता है (प्रति popToRootViewController)
  2. मास्टर दृश्य दिखाया गया है, पर प्रकाश डाला सही पंक्ति के साथ (सहित NSLog कह "मास्टर में")
  3. फ़ंक्शन निष्पादित, सहित prepare(for:sender) लेकिन विवरण दृश्य कभी नहीं दिखाया गया है।

इस बिंदु पर, मैं उचित पंक्ति टैप कर सकते हैं, और segue होता है के रूप में उम्मीद - कि tableView(:didSelectRowAt:) कॉल performSegue है।

और अधिक विवरण

स्विफ्ट 3.0 & आईओएस 10

ऐप अपने rootViewController के रूप में एक UISplitViewController है। मास्टर व्यू व्यंजनों की एक सूची के साथ एक तालिका दृश्य है। विस्तार दृश्य एक तालिका है जो चयनित नुस्खा के लिए सामग्री सूचीबद्ध करता है। रेसिपी पंक्ति चयन से इसकी घटक तालिका में segue संक्रमण।

मैं एक नई सुविधा डाल रहा हूं: व्यंजनों को स्पॉटलाइट में डाल देना, जैसे कि उपयोगकर्ता उन्हें खोज सकता है और जब चयनित होता है, तो नुस्खा मास्टर व्यू से चुना जाता है और इसकी सामग्री विस्तृत दृश्य में दिखाई जाती है।

अब मैं AppDelegate के application(:continue:restorationHandler) के माध्यम से स्पॉटलाइट खोज एकीकरण को लागू करने की कोशिश कर रहा हूँ: RecipeMasterVC भीतर

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 
} 

, मैं segue को

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

मास्टर व्यू कंट्रोलर अभी तक लोड नहीं हो सकता है। व्यू कंट्रोलर के अस्तित्व के लिए यह पूरी तरह से संभव है - स्प्लिट व्यू कंट्रोलर को संदर्भित करने के लिए init() को कॉल किया गया है, लेकिन viewDidLoad() को कॉल नहीं किया गया है। दृश्य डीडलोड() में कुछ डीबग कोड जोड़ने का प्रयास करें या मास्टर व्यू वास्तव में लोड होने पर पता लगाने के लिए selectTableRow के अंदर isViewLoaded विधि की जांच करें। – Dale

+0

@Dale - 'डिस्पैच {performSegue}' से ठीक पहले, 'self.isViewLoaded'' का मान सत्य है। – AgRizzo

+0

मेरे पास अपने स्वयं के ऐप में एक समान परिदृश्य है, सीगू का उपयोग नहीं कर रहा है लेकिन अभी भी विभाजित दृश्यों का उपयोग कर रहा है। जब मैंने कोड की जांच की तो मुझे लगता है कि इसे काम करने के लिए मुझे 200ms की देरी जोड़नी पड़ी। मूल कारण को कभी नहीं मिला, लेकिन कोई विलंब नहीं, यहां तक ​​कि प्रेषण एसिंक के साथ भी काम नहीं करता है अगर विवरण स्क्रीन पहले से प्रदर्शित हो रही है – Dale

उत्तर

3

मैं में एक समान परिदृश्य है इस कोड को जोड़ा मेरी स्वयं का ऐप, segue का उपयोग नहीं कर रहा है लेकिन अभी भी विभाजित विचारों का उपयोग कर रहा है। जब मैंने कोड की जांच की तो मुझे लगता है कि इसे काम करने के लिए मुझे 200ms की देरी जोड़नी पड़ी। रूट कारण को कभी नहीं मिला, लेकिन कोई देरी नहीं है, यहां तक ​​कि प्रेषण एसिंक भी काम नहीं कर रहा है अगर विवरण स्क्रीन पहले से प्रदर्शित हो रही है

संबंधित मुद्दे