2015-06-03 8 views
9

मैं इस है:एम्बेडेड दृश्य नियंत्रक से एक माता पिता segue प्रदर्शन करना

  • MyTableViewController (UITableViewController से विरासत में मिली)

    • यह कुछ कोशिकाओं (foo, बार, qux साथ एक गतिशील tableview है)

  • MyViewController (से विरासत में मिली

    :)

    • कुछ "शो"
    • यह एक UIContainerView कि MyTableViewController
एम्बेड करता है

एक तस्वीर बोलती है एक हजार शब्दों के अन्य दृश्य नियंत्रकों को यह नियंत्रक से segues रहे हैं

embedded uitableviewcontroller

जब कोई निश्चित सी ell चयन किया जाता है, मैं माता पिता को देखने के एक segue निष्पादित करना चाहते हैं (MyViewController)

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     if (indexPath.section == 1 && indexPath.row == 1) { 
       self.WHAT.performSegueWithIdentifier("someShowSegue1", sender: self) 
     } 
    } 

क्या यह संभव है? «WHAT» में मुझे क्या उपयोग करना चाहिए?

उत्तर

8

prepareForSegue: में अपने एम्बेडेड segue के लिए अपने tableViewController में एक नया संपत्ति में viewController निर्धारित करते हैं, यह parentController नाम करते हैं। और फिर आपको self.parentController.performSegueWithIdentifier() पर कॉल करना होगा।

EDIT: लेकिन सबसे पहले, शायद आप मौजूदा parentViewController का उपयोग कर सकते हैं यदि इसमें एम्बेडिंग व्यू कंट्रोलर है।

+3

प्रत्येक बाल दृश्य नियंत्रक सीधे parentViewController का उपयोग करके अपने माता-पिता तक पहुंच सकता है। हमें इसका नाम नहीं देना है, यह पहले से ही उपलब्ध है। UIViewController शीर्षलेख के माध्यम से देखें :) – Sandeep

+0

ओह हाँ, यह सच है, लेकिन यह पढ़ा गया है ... मैं इसे अपने उत्तर में बदल दूंगा। – Zaphod

+0

वास्तव में parentViewController का उपयोग करना पर्याप्त था। हालांकि विचार अच्छा था :) – sports

0

सेगु को एक व्यू कंट्रोलर से दूसरे में परिभाषित किया गया है और इसे केवल व्यू कंट्रोलर से ही बुलाया गया है जिसमें इसे परिभाषित किया गया है। तो आपको parentViewController के संदर्भ को स्टोर करने की आवश्यकता होगी।

तरह MyViewController

if ([segueName isEqualToString: @"embedseg"]) { 
    MyTableViewController * tblViewController = (MyTableViewController *) [segue destinationViewController]; 
    tblViewController.parentController=self; //Storing reference of parentViewController i.e MyViewController 
} 

अब से आप बस की तरह

self.parentController.performSegueWithIdentifier("someShowSegue1", sender: self) 

आशा segues आह्वान कर सकते हैं इस में मदद करता है

3

आप बच्चे tableView के बाद से इस समस्या को हल करने के लिए प्रतिनिधिमंडल का उपयोग कर विचार कर सकते हैं ऐसा लगता है कि यह segue के लिए जिम्मेदार होना चाहिए। उदाहरण के लिए:

// MyViewController 
class MyViewController: UIViewController, MyTableViewControllerDelegate { 

    func selectedMyTableViewControllerCell(cell: UITableViewCell) { 
     // ... check cell type or index or whatever 
     self.performSegueWithIdentifier("someValueFromCellType", sender: self) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == myTableViewControllerIdentifier { 
      if let vc = segue.destinationViewController as MyTableViewController? { 
       vc.delegate = self 
      } 
     } 
    } 
} 

// MyTableViewController 
protocol MyTableViewControllerDelegate: class { 
    func selectedMyTableViewControllerCell(cell: UITableViewCell) 
} 

class MyTableViewController: UITableViewController { 
    weak var delegate: MyTableViewControllerDelegate? 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     // ... get the cell 
     delegate?.selectedMyTableViewControllerCell(cell) 
    } 
} 
0

इसके बजाय एम्बेडेड टेबल व्यू कंट्रोलर पर अपने segues को दबाएं। आप प्रति सेल प्रोटोटाइप के विभिन्न segues का उपयोग कर सकते हैं। यह आपको इंडेक्स पथों की जांच करने या यहां तक ​​कि कार्यान्वित करने के लिए भी बचाता है।

0

कोई संपत्ति बनाने की आवश्यकता नहीं है।बस यह

self.parent?.performSegue(withIdentifier: "ID", sender: self) 
संबंधित मुद्दे