2012-09-06 8 views
26

मैं एक विस्तार प्रकटीकरण बटन बना रहा हूं जो एक सरणी का उपयोग करके आबादी प्राप्त कर रहा है .... एक्सेसरीबटन को कैसे हटाएं बटनफॉर्ड्सफॉररोविथ इंडेक्सपैथ: मेरी कक्षा में फ़ंक्शन नहीं कहा जा रहा है। यह एक tableviewdelegate और tableviewdatasource प्रतिनिधि है।एक्सेसरीबटनटैप्डफॉररोविथ इंडेक्सपैथ: कॉल नहीं किया जा रहा है।

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{ 
    NSLog(@"reaching accessoryButtonTappedForRowWithIndexPath:"); 
    [self performSegueWithIdentifier:@"modaltodetails" sender:[self.eventsTable cellForRowAtIndexPath:indexPath]]; 
} 

NSLog नहीं है मुद्रण सांत्वना देने जो मुझे विश्वास करने के लिए समारोह नहीं है बुलाया जा रहा है ... जब मैं एक सेल पर चयन इस कोर्स की है। नीचे एक स्क्रीनशॉट दिखाता है कि मेरे सेल सेटअप कैसे है।

enter image description here

+0

क्या आप वाकई डेटा स्रोत और उचित वर्ग के लिए प्रतिनिधि जुड़े हैं? क्या '- (शून्य) तालिका दृश्य: (UITableView *) तालिका दृश्य देखा गया चयन करें IndexPath: (NSIndexPath *) indexPath' विधि कहलाती है? – Thermometer

+0

हां (शून्य) तालिका दृश्य: (UITableView *) तालिका दृश्य देखा चयन करेंटएंड इंडेक्सपैथ: (एनएसआईएंडएक्सपाथ *) इंडेक्सपाथ बुलाया जा रहा है। – jimbob

उत्तर

7

तुम सिर्फ सेल पर क्लिक किया था उसे चुनने के लिए या आप वास्तव में सेल पर सहायक बटन सूचक पर क्लिक किया? यह आपके प्रश्न से स्पष्ट नहीं है।

accessoryButtonTappedForRowWithIndexPath लागू होता है जब आप सेल के भीतर बटन आइकन पर क्लिक करते हैं और जब आप सेल का चयन नहीं करते हैं।

+0

बटन – jimbob

+0

पर क्लिक किया है क्या आपने सभी आवश्यक कनेक्शन बनाए हैं .. दोनों टेबलव्यू डेटा स्रोत और फ़ाइल स्वामी को प्रतिनिधि? – Coder

+0

क्या आपको पता चला कि समस्या क्या थी? – Coder

54

दस्तावेज़ कहता है कि विधि tableView:accessoryButtonTappedForRowWithIndexPath: को कॉल नहीं किया जाता है जब indexPath पर पंक्ति के लिए एक एक्सेसरी दृश्य सेट किया जाता है। विधि केवल तभी बुलाई जाती है जब accessoryView संपत्ति शून्य होती है और जब कोई अंतर्निहित सहायक दृश्य प्रदर्शित करने के लिए accessoryType प्रॉपर्टी का उपयोग करता है और सेट करता है। जैसा कि मैं इसे समझता हूं, accessoryView और accessoryType पारस्परिक रूप से अनन्य हैं। accessoryType का उपयोग करते समय, सिस्टम tableView:accessoryButtonTappedForRowWithIndexPath: को अपेक्षित के रूप में कॉल करेगा, लेकिन आपको स्वयं को अन्य मामले से संभालना होगा।

ऐप्पल ऐसा करता है जिस तरह से यह एसडीके की Accessory नमूना परियोजना में दिखाया गया है। डेटासोर्स प्रतिनिधि के cellForRowAtIndexPath विधि में, उन्होंने कस्टम एक्सेसरी बटन पर एक लक्ष्य/क्रिया निर्धारित की है। के बाद से एक कार्रवाई करने के लिए indexPath पारित नहीं हो सकता है, वे इसी indexPath को पुनः प्राप्त करने के लिए एक सहायक विधि कॉल और वे प्रतिनिधि विधि के लिए परिणाम पारित:

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

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    ... 

    // set the button's target to this table view controller so we can interpret touch events and map that to a NSIndexSet 
    [button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 
    ... 
    cell.accessoryView = button; 

    return cell; 
} 


- (void)checkButtonTapped:(id)sender event:(id)event{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 
    if (indexPath != nil){ 
     [self tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath]; 
    } 
} 

किसी कारण से, अपने सेटअप में गिर रहा है accessoryView केस। क्या आपने इंटरफ़ेस बिल्डर का उपयोग करने के बजाय कोड के साथ accessoryType सेट करने का प्रयास किया है?

+0

मैंने एक ही समस्या में भाग लिया है और मैं सोच रहा हूं कि Xcode 4.5 आईबी में कोई बग है कि जब आप TableViewCell इंस्पेक्टर फलक में एक्सेसरी चुनते हैं तो 'AccesoryType' की बजाय' AccessoryView' सेट कर रहा है '।यदि आप प्रकटीकरण सूचक से क्लिक करके खींचकर एक सेगू बनाते हैं जो या तो काम नहीं करता है! – drew

+4

त्वरित अद्यतन - ऐसा प्रतीत होता है कि यदि आप एक्सेसरी प्रकार को केवल 'प्रकटीकरण' के बजाय 'DetailDisclosure' पर सेट करते हैं, तो' accessoryButtonTappedForRowWithIndexPath' विधि को कॉल किया जाता है और एक ट्रिगर किए गए सेग्यू काम करता है। मैं अभी तक क्यों काम नहीं कर सकता, लेकिन कम से कम आप कुछ हेडवे बना सकते हैं (भले ही आपका यूआई जिस तरह से आप इसे देखना चाहते हैं)। – drew

+1

तो क्या यह एक्सकोड, या इच्छित व्यवहार में एक बग है? इस पर ऐप्पल के दस्तावेज़ खतरनाक रूप से अस्पष्ट हैं। तालिका कक्ष, सादा प्रकटीकरण और विस्तार प्रकटीकरण पर दो प्रकार के प्रकटीकरण संकेतक हैं, लेकिन दस्तावेज़ केवल "प्रकटीकरण बटन" कहते हैं। – SteveCaine

2

आकर्षित स्थान पर है।

यदि आप स्टोरीबोर्ड में 'DetailDisclosure' में बदल जाते हैं, तो विधि आग लग जाएगी। (Xcode 4.6 DP3)

36

यह बहुत प्रासंगिक लगती है ...

प्रकटीकरण सूचक: जब इस तत्व मौजूद है, उन जानते हैं कि वे पदानुक्रम या में अगले स्तर को देखने के लिए पंक्ति में कहीं भी उपयोग कर सकते हैं सूची आइटम से जुड़े विकल्प। किसी अन्य सूची के प्रदर्शन में पंक्ति परिणामों का चयन करते समय एक पंक्ति में एक प्रकटीकरण सूचक का उपयोग करें। सूची आइटम के बारे में विस्तृत जानकारी प्रकट करने के लिए प्रकटीकरण सूचक का उपयोग न करें; इसके बजाय, इस उद्देश्य के लिए एक विस्तार प्रकटीकरण बटन का उपयोग करें।

विस्तृत प्रकटीकरण बटन: उपयोगकर्ता सूची आइटम के बारे में विस्तृत जानकारी देखने के लिए इस तत्व को टैप करते हैं। (ध्यान दें कि आप इस तत्व का उपयोग तालिका दृश्यों के अलावा अन्य विचारों में कर सकते हैं, कुछ के बारे में अतिरिक्त विवरण प्रकट करने के लिए; अधिक जानकारी के लिए "विस्तार प्रकटीकरण बटन" देखें।) तालिका दृश्य में, विवरण के बारे में विवरण प्रदर्शित करने के लिए एक पंक्ति में एक विस्तृत प्रकटीकरण बटन का उपयोग करें सूची वस्तु ध्यान दें कि प्रकटीकरण सूचक के विपरीत विस्तार प्रकटीकरण बटन, पंक्ति के चयन से अलग एक क्रिया निष्पादित कर सकता है।उदाहरण के लिए, फोन पसंदीदा में, पंक्ति को टैप करने से संपर्क में कॉल शुरू होता है; पंक्ति में विस्तार प्रकटीकरण बटन को टैप करने से संपर्क के बारे में अधिक जानकारी मिलती है।

+1

अधिक जानकारी के लिए लिंक: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/mobilehig/Controls.html –

+0

मुझे यह समस्या मिली और यह समाधान मेरे लिए काम किया – sapatos

8

UITableViewCellAccessoryType के दस्तावेज़ के अनुसार यह अपेक्षित व्यवहार:

typedef enum : NSInteger {  
UITableViewCellAccessoryNone, 
UITableViewCellAccessoryDisclosureIndicator, 
UITableViewCellAccessoryDetailDisclosureButton, 
UITableViewCellAccessoryCheckmark, 
UITableViewCellAccessoryDetailButton } UITableViewCellAccessoryType; 

स्थिरांक UITableViewCellAccessoryNone सेल किसी भी गौण दृश्य नहीं है। यह व्यतिक्रम मूल्य है।

UITableViewCellAccessoryDisclosureIndicator सेल में एक सहायक शेवरॉन की तरह आकार का नियंत्रण होता है। यह नियंत्रण इंगित करता है कि सेल टैप करने से पुश एक्शन ट्रिगर होता है। नियंत्रण स्पर्श को ट्रैक नहीं करता है।

UITableViewCellAccessoryDetailDisclosureButton सेल में एक जानकारी बटन और सामग्री के रूप में शेवरॉन छवि है। यह नियंत्रण इंगित करता है कि सेल टैप करने से उपयोगकर्ता सेल की सामग्री को कॉन्फ़िगर कर सकता है। नियंत्रण ट्रैक छूता है।

UITableViewCellAccessoryCheckmark सेल में दाईं तरफ एक चेक मार्क है। यह नियंत्रण स्पर्श को ट्रैक नहीं करता है। तालिका दृश्य के प्रतिनिधि तालिका में पंक्तियों के एक खंड में संभवतः चेक अंक प्रबंधित कर सकते हैं (संभावित रूप से अनुभाग की एक पंक्ति में चेक मार्क को सीमित करना) दृश्य: didSelectRowAtIndexPath: विधि।

UITableViewCellAccessoryDetailButton सेल में एक शेवरॉन के बिना एक जानकारी बटन है। यह नियंत्रण इंगित करता है कि सेल टैप करने से सेल की सामग्री के बारे में अतिरिक्त जानकारी प्रदर्शित होती है। नियंत्रण ट्रैक छूता है।

0

स्टोरीबोर्ड का उपयोग करके प्रकटीकरण बटन को संभालने का यह एक और तरीका है। आपको टेबल व्यू सेल पर क्लिक करना चाहिए और कनेक्शन इंस्पेक्टर मिलना चाहिए। Triggered Segues नामक एक अनुभाग है, और आप चयन रेखा से UIViewController पर खींच सकते हैं जिसे आप segue करना चाहते हैं। सीगू स्वचालित रूप से हो जाएगा और जब आप ऐसा करते हैं तो अधिसूचना को कैप्चर करने के लिए आप तैयार कर सकते हैं।
फ़ंक्शन एक्सेसरीज़बटनटैप्डफॉररोविथ इंडेक्सपैथ कभी प्रकटीकरण बटन के लिए नहीं बुलाया जाता है। इसे केवल विस्तृत प्रकटीकरण बटन के लिए बुलाया जाता है।

3

स्विफ्ट 3 करने के लिए शीर्ष जवाब परिवर्तित:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    ... 
    let unseletcedImage = UIImage(named: "<imagename>") 
    let seletcedImage = UIImage(named: "<imagename>") 
    let button = UIButton(type: .custom) 
    // match the button's size with the image size 
    let frame = CGRect(x: CGFloat(0.0), y: CGFloat(0.0), width: CGFloat((unseletcedImage?.size.width)!), height: CGFloat((unseletcedImage?.size.height)!)) 
    button.frame = frame 
    button.setBackgroundImage(unseletcedImage, for: .normal) 
    button.setBackgroundImage(seletcedImage, for: .selected) 
    cell?.accessoryView = button 
    let action = #selector(checkButtonTapped(sender:event:)) 
    (cell?.accessoryView as? UIButton)?.addTarget(self, action: action, for: .touchUpInside) 
    .... 
    return cell! 

} 

@objc func checkButtonTapped(sender: UIButton?, event: UIEvent) { 
    let touches = event.allTouches 
    let touch = touches!.first 
    guard let touchPosition = touch?.location(in: self.tableView) else { 
     return 
    } 
    if let indexPath = tableView.indexPathForRow(at: touchPosition) { 
     tableView(self.tableView, accessoryButtonTappedForRowWith: indexPath) 
    } 
}