UITableView के लिए didSelectRowAtIndexPath या readyForSegue विधि का उपयोग करें?


101

मैं स्टोरीबोर्ड का उपयोग कर रहा हूं और मेरे पास एक यूआईटेबल व्यू है। मेरे पास एक सेगमेंट सेटअप है जो मेरी तालिका से विस्तार वीसी के लिए धक्का देता है। लेकिन मुझे इसे संभालने के लिए किस विधि का उपयोग करना चाहिए? मैं विस्तार से देखने के लिए कुछ वस्तुओं को पास करना होगा। लेकिन क्या मैं उपयोग करता हूं didSelectRowAtIndexया -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender?

जवाबों:


199

यदि तुम प्रयोग करते हो prepareForSegue:sender: तो आपके पास बदलने के लिए उतना नहीं होगा यदि आप बाद में तालिका दृश्य के बाहर कुछ नियंत्रण से बहस को ट्रिगर करने का निर्णय लेते हैं।

prepareForSegue:sender:संदेश वर्तमान दृश्य नियंत्रक करने के लिए भेज दिया जाता है, तो मैं कुछ इस तरह का सुझाव चाहते हैं:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Assume self.view is the table view
    NSIndexPath *path = [self.tableView indexPathForSelectedRow];
    DetailObject *detail = [self detailForIndexPath:path];
    [segue.destinationViewController setDetail:detail];
}

स्विफ्ट में:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let path = self.tableView.indexPathForSelectedRow()!
    segue.destinationViewController.detail = self.detailForIndexPath(path)
}

1
ठीक है, क्या आप इसका उदाहरण दे सकते हैं कि इंडेक्सपाथ पर आधारित ऑब्जेक्ट को पास करने के साथ इसे कैसे लागू किया जाए।
जॉन

4
self.viewबस senderयहाँ नहीं होना चाहिए ? मैं भी नहीं मिल सकता है [self.view indexPathForSelectedRow]काम करने के लिए, मैं नहीं था[sender indexPathForSelectedRow];
ladookie

आप स्विफ्ट में यह कैसे करेंगे?
यूजर

@robmayoff स्विफ्ट के लिए इसे अपडेट करने के लिए धन्यवाद। मैंने हाल के भाषा परिवर्तनों को प्रतिबिंबित करने के लिए कुछ मामूली संपादन किए। आशा है कि यह कुछ अन्य लोगों की मदद करता है
Zack Shapiro

यह अजीब है tableView.indexPathForSelectedRow()जिसमें कहा जाने वाला सही मूल्य prepareFroSegue...है: tableView(_:didSelectrowAtIndexPath:)बाद में जब तक नहीं बुलाया जाता है।
निकोलस मिआरी

5

मैंने यह किया और यह काम किया

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    NSLog(@"Row Selected = %i",indexPath.row);

    [self performSegueWithIdentifier:@"testID" sender:self.view];    
}

11
इसका कोई मतलब नहीं है। आपको सीग या टेबल व्यू डेलीगेट का उपयोग करना चाहिए। बस सेल से एक बहस बनाएँ और यह स्वचालित रूप से वही काम करेगा जो आपने कोड लिखे बिना किया था।
यारिव निसिम

3
आप बिना किसी सेल के एक सेगमेंट कैसे करते हैं?
मॉर्क्रोम

3

जब प्रेषक UITableViewCell है, तो आप UITableView को सेल के इंडेक्सपैथ को क्वेरी करने के लिए कह सकते हैं।

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let cell = sender as? UITableViewCell {
            let indexPath = self.tableView.indexPathForCell(cell)!
            assert(segue.destinationViewController.isKindOfClass(DetailViewController))
            let detailViewController = segue.destinationViewController as! DetailViewController
            detailViewController.item = self.items[indexPath.row] // like this
        }
    }

1

यदि आपकी तालिका दृश्य संपत्ति किसी अन्य वर्ग में है और आपके पास केवल एक अनुभाग है , तो आप tagसंपत्ति का उपयोग सेल की पंक्ति को संग्रहीत करने के लिए कर सकते हैं :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

     cell.tag = indexPath.row;

     return cell;
}

और फिर आप इसे एक्सेस कर सकते हैं क्योंकि senderइसके टैग में पंक्ति मूल्य के साथ एक ही सेल है:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    MyDestinationViewController *destinationViewController = segue.destinationViewController;
    destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; // sender will be your cell 
}

1

self.tableView.indexPathForSelectedRowचयनित सेल लौटाता है, लेकिन प्रेषक सेल को नहीं देखता है, जैसे कि प्रेषक सेल चयनित (एक्सेसरी एक्शन), या कई चयन मामले में नहीं है। सबसे अच्छा तरीका है, सेंगर प्रेषक के लिए indexPath प्राप्त कर रहा है:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    __auto_type itemViewController = (id<ItemViewController>)segue.destinationViewController;
    itemViewController.senderIndexPath = [self.tableView indexPathForCell:sender];
}

स्विफ्ट में:

protocol ItemViewController {
    var senderIndexPath : IndexPath? { get set }
    var selectedIndexPaths : [IndexPath]? { get set }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if  let cell = sender as? UITableViewCell,
        var itemViewController = segue.destination as? ItemViewController {
        itemViewController.senderIndexPath = tableView.indexPath(for: cell)
        itemViewController.selectedIndexPaths = tableView.indexPathsForSelectedRows
    }
}

0

यदि तुम प्रयोग करते हो prepareForSegue: करते हैं, देख सकते हैं कि प्रेषक कौन है और विभिन्न कोड निष्पादित करें

उदाहरण के लिए स्विफ्ट में

override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?)
{
   var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell)

   if senderIsTableviewCell
   {
       //do something
   }
}

2
बस करते हैं: अगर tableViewCell = प्रेषक के रूप में दें? UITableViewCell {// कुछ करें} । यदि प्रेषक को UITableViewCell में नहीं डाला जा सकता है, तो "कुछ करें" निष्पादित नहीं होगा।
मिती
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.