2012-11-22 12 views
5

में चयनित सहायक बटन के लिए मैं UITableViewCell गौण बटन के साथ एक समस्या है। मेरे गौण बटन एक और UIViewController के लिए एक segue के साथ "जुड़ा" है। जब मैं एक सहायक बटन पर टैप, मैं मॉडल से वस्तु हो और मैं segue destinationViewController को यह वस्तु "पारित"। यह मेरा segue विधि के लिए तैयार:प्राप्त IndexPath UITableView

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"IdentityCard"]) 
    { 
     NSLog(@"%i" ,self.tableView.indexPathForSelectedRow.row); 
     [segue.destinationViewController showIdentityCardForTeacher:[self.teachers getTeacherInPosition:self.tableView.indexPathForSelectedRow.row]]; 
    } 
} 

समस्या यह है कि विधि की शुरुआत में NSLog ("अगर" के बाद) हमेशा दिखाने संख्या 0 है! मैं विधि को लागू करने की कोशिश की:

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 

लेकिन segue विधि के लिए तैयार इस विधि से पहले मार डाला जाता है, तो मैं "बचाने" indexPath के लिए किसी भी @property निर्धारित नहीं कर सकते। मैं इस समस्या को कैसे हल कर सकता हूं?

उत्तर

1

मैं इस तरह से समस्या को ठीक करता हूं: मैंने UIViewController को गंतव्य दृश्य नियंत्रक से जोड़ा (एक्सेसरी बटन से नहीं - UIViewController से)।

मैं पहली बार दृश्य नियंत्रक में एक @property बनाया:

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"Disclosure Tapped----> %i" ,indexPath.row); 
    self.indexPathRow = indexPath.row; 
    [self performSegueWithIdentifier:@"IdentityCard" sender:self]; 
} 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"IdentityCard"]) 
    { 
     NSLog(@"%i" ,self.tableView.indexPathForSelectedRow.row); 
     [segue.destinationViewController showIdentityCardForTeacher:[self.teachers getTeacherInPosition:self.indexPathRow]]; 
    } 
} 

अब यह काम करता है:

@property (nonatomic) NSInteger indexPathRow; 

तो मैं इस तरह कोड को संशोधित किया!

20

में:

- (शून्य) prepareForSegue: (UIStoryboardSegue *) segue इस: (आईडी) इस

... आप 'इस' पैरामीटर देता है कि आप में से सेल को पता है एक्सेसरी जो टैप किया गया है, इसलिए:

अनुक्रमणिका = [self.tableView indexPathForCell: प्रेषक] .row;

आपको इसका इस्तेमाल करने में इसका सूचकांक मिल सकती है।

फिर आपको तालिका दृश्य का उपयोग करने की आवश्यकता नहीं है ButtonTappedForRowWithIndexPath विधि।

+0

धन्यवाद! मैं वास्तव में कभी नहीं महसूस किया कि इस पूर्ण रूप से अपने सेल के साथ आबादी वाले हो जाता है। यह एक तरह से समझ में आता है, हालांकि: डी – Fogmeister

0

@ एंड्रेस का समाधान मेरे लिए काम करता है लेकिन अगर मैं नेविगेशनबार में ऐड बटन जोड़ना चाहता हूं और मैं उसी सीगू पहचानकर्ता के साथ एक ही व्यू कंट्रोलर दिखाना चाहता हूं तो index = [self.tableView indexPathForCell:sender].row; कोड काम नहीं करता क्योंकि प्रेषक UITableViewCell का उप-वर्ग नहीं है। तो यहां @Andres कोड के साथ मेरा समाधान है:

- (void) addItem: (id) sender { 
    [self performSegueWithIdentifier: @"Identifier" sender: self]; 
} 

- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender { 
    id selectedObject; 
    if (![[sender class] isSubclassOfClass: [UITableViewCell class]]) { 
     // create a new object 
     selectedObject = [...]; 
    } 
    else { 
     selectedObject = [objectArray objectAtIndex: [self.tableView indexPathForCell: sender].row]; 
    } 

    if ([[segue identifier] isEqualToString: @"Identifier"]) { 
     // use the new or existing object 
     [selectedObject doSonething]; 
    } 
}