2015-04-30 13 views
6

Ben prepareForSegue işlevinden segues kullanarak veri aktarmak için biliyorum, ama bir TableViewCell gereken şey hangi iki farklı ViewControllers (şimdi sadece iki olası Segues vardır şimdi A, B deyin). here önerisi, segmanların mükemmel bir şekilde çalıştığı tableCell'in kendisinden ziyade View denetleyicisini View controller'a bağlamak için önerildi. Ancak hücre tıklandığında ikinci View denetleyicisine bilgi aktarmak istiyorum, Kaynak ViewController'a bağlandığım segue'a nasıl erişilir.'didSelectRowAtIndexPath' de segue erişme -/Swift IOS

Kodu:

İçinde prepareForSegue

Yine
if segue.identifier == "showQuestionnaire"{ 
     if let indexPath = self.tableView.indexPathForSelectedRow() { 
     let controller = (segue.destinationViewController as! UINavigationController).topViewController as! QuestionnaireController 
     let patientQuestionnaire = patientQuestionnaires[indexPath.row] as! PatientQuestionnaire 
     controller.selectedQuestionnaire = patientQuestionnaire 
     self.performSegueWithIdentifier("showQuestionnaire", sender: self) 
     } 
    } 

: Bu soru prepareForSegue

içinden bilgi aktarma konusunda değil
+0

olmalıdır önce açıklandığı gibi metodun bir performSegueWithIdentifier dışında gerekir, ancak soru prepareForSegue veri göndermek için nasıl ise, performSegueWithIdentifier – user3435374

+0

gönderen alanını kullanın if ([segue.destinationViewController isKindOfClass: [A_VC class]]) {...} else {...} – OMGHaveFun

+1

"prepareForSegue" dosyasındaki bilgilerin aktarılması, bunu yapmanın doğru yolu. Ancak kesinlikle readyForSegue' içinde 'performSegueWithIdentifier' çağrısı olmamalıdır. – dan

cevap

23

Bir hücre olup olmadığını belirlemek için didSelectRowAtIndexPath yöntemi kullanılarak yapılmalıdır seçildi senin prepareForSegue yöntemle

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
    if (segue.identifier == "showQuestionnaire") { 
     let controller = (segue.destinationViewController as! UINavigationController).topViewController as! QuestionnaireController 
     let row = (sender as! NSIndexPath).row; //we know that sender is an NSIndexPath here. 
     let patientQuestionnaire = patientQuestionnaires[row] as! PatientQuestionnaire 
     controller.selectedQuestionnaire = patientQuestionnaire 
    } 
} 

açıklamak için de Sonra

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    self.performSegueWithIdentifier("showQuestionnaire", sender: indexPath); 
} 

...

  1. Ben yüzden kolayca endeksi yolunu geçebilir gönderen olarak endeks yolunu kullandı. Diğer UITableView yöntemlerini kullanarak seçili olan hücreyi de kontrol edebilirsiniz, ancak her zaman başarı ile bu şekilde yaptım.
  2. performSegueWithIdentifier segue metoduna hazırlanamazsınız, çünkü performSegueWithIdentifierprepareForSegue; Sadece amaçsızca etrafta dolaşıyorsunuz. (Bir segue gerçekleştirmek istediğinizde, readyForSegue her zaman çalıştırılır) Bir satır seçildiğinde,
  3. prepareForSegue kendi kendine çalışmaz. Bu, didSelectRowAtIndexPath'a ihtiyaç duyduğunuz yerdir. Ben soruyu alamadım hangi didSelectRowAtIndexPath
+0

Çözünürlüğünüzü denedim, ancak bu hatayı verdim = '' controller '' (segue.destinationVIewController .... '. **. 'UIViewController' (0x105866418) türünün 'CarePortal.QuestionnaireController' (0x1034f1850) değerine dökülen değeri. ** – Sashi

+0

Muhtemelen yanlış nesne türünü büyük olasılıkla yayınlamaya ayarladınız, kontrol edip yaptığınız her şeyin olduğundan emin misiniz? –

+1

Tanımlama ** olarak! ** to ** olarak? ** hile yaptı Teşekkürler @Nate Swift gerçekten isteğe bağlı değerler hakkında katılaşıyor: @ – Sashi