2015-01-09 8 views
13

में अतिरिक्त बटन जोड़ें वर्तमान में मैं tableviews को संभालने के लिए NSFetchedResultsController का उपयोग कर रहा हूं। मुझे आश्चर्य है कि स्वाइप ऑपरेशन में डिलीट बटन जैसे अतिरिक्त बटन जोड़ने का कोई तरीका है?UITableView स्वाइप

मैं इसे सबक्लास करने के बारे में सोच रहा हूं। लेकिन मेरी समस्याओं के लिए मदद दस्तावेज़ों में कुछ भी प्रासंगिक नहीं है।

अग्रिम धन्यवाद।

उत्तर

46

आपका शीर्षक भ्रामक है। NSFetchedResultsController आपके अंतिम लक्ष्य के लिए कोई प्रासंगिकता नहीं है। सबक्लासिंग केवल आवश्यकतानुसार अधिक काम करेगा, जिसे आप देखना चाहते हैं UITableViewRowAction है। यह बहुत आसानी से & इसी तरह नई UIAlertController को संभालती है, ताकि आप अगर आप पहले से UIAlertController

के साथ dabbled है एक संक्षिप्त सारांश (the docs से सीधे) UITableViewRowAction की इस के साथ बेहद सहज महसूस करना चाहिए:

पूछते निर्दिष्ट पंक्ति में एक स्वाइप के जवाब में प्रदर्शित करने के लिए कार्यों के प्रतिनिधि। (आवश्यक) जब आप अपनी तालिका पंक्तियों में से किसी एक के लिए कस्टम क्रियाएं प्रदान करना चाहते हैं तो इस विधि का उपयोग करें। जब उपयोगकर्ता एक पंक्ति में क्षैतिज रूप से स्वाइप करता है, तो तालिका दृश्य पंक्ति क्रिया को आपके कार्यों को प्रकट करने के लिए अलग-अलग स्थानांतरित करता है। एक्शन बटन में से एक को टैप करने से एक्शन ऑब्जेक्ट से जुड़े हैंडलर ब्लॉक को निष्पादित किया जाता है। यदि आप इस विधि को लागू नहीं करते हैं, तो तालिका दृश्य मानक एक्सेसरी बटन प्रदर्शित करता है जब उपयोगकर्ता पंक्ति को स्वाइप करता है।

एक जोड़े नोट शुरू करने से पहले:

  • एप्पल iOS8 में यह लागू किया: तो अपने तैनाती लक्ष्य के बारे में अच्छी तरह सोच। यदि आप i0S8 के लिए सख्ती से कोडिंग कर रहे हैं तो यह तृतीय पक्ष पुस्तकालयों के लिए एक त्वरित और आसान विकल्प है या एक कस्टम UITableView संपादन शैली बना रहा है। यदि आप आईओएस 7 के लिए संगतता बनाए रखना चाहते हैं तो आपके विकल्प इस प्रारूप से सीमित हैं। साइड नोट इससे आपके कोड में घातक त्रुटि नहीं आती है, आईओएस 7 ऐप्स क्रैश नहीं होंगे, हालांकि, कस्टम क्रियाएं बस प्रदर्शित नहीं होंगी।
  • और भी बहुत कुछ शीर्षक से परे अनुरूपण नहीं है
  • इस के पेशेवरों, कि सब कुछ परवाह किए बिना एक कस्टम को लागू करने के UITableViewRowAction आप पहली बार यह सुनिश्चित करना चाहिए अपनी मेज पर कॉल करके संपादन योग्य है ब्लॉक

साथ नियंत्रित किया जाता है, है निम्नलिखित विधियों:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    //Obviously, if this returns no, the edit option won't even populate 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    //Nothing gets called here if you invoke `tableView:editActionsForRowAtIndexPath:` according to Apple docs so just leave this method blank 
} 

कम से कम, वे दो विधियां हैं जिन्हें आगे बढ़ने से पहले घोषित करने की आवश्यकता है।

वास्तव में अपने पंक्ति कार्रवाई बटन को अनुकूलित करने के लिए, सामान्य दिशानिर्देश का पालन करें इस प्रकार है:

कदम 1 लागू tableView:editActionsForRowAtIndexPath: विधि

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { 
} 

आप देख सकते हैं, यह प्रकार NSArray का एक उदाहरण विधि है , तो आपको एक सरणी वापस करनी है।

चरण 2 सरणी में पास करने के लिए क्रिया ऑब्जेक्ट जोड़ें। एक उदाहरण:

{ 

UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
{ 
    // Delete something here 
}]; 

UITableViewRowAction *more = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@" More " handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
{ 
    //Do whatever here : just as an example : 
    [self presentUIAlertControllerActionSheet]; 
}]; 

}  

आप इन पंक्ति कार्यों के लिए कुछ विशेषताओं को परिवर्तित कर सकते हैं, लेकिन पूरा अनुकूलन विकल्प के लिए दस्तावेज देखें:

पंक्ति कार्रवाई पृष्ठभूमि रंग को अनुकूलित के लिए, बस सबसे अन्य की तरह यह पहिले बटन के भीतर कार्रवाई:

delete.backgroundColor = [UIColor redColor]; 
more.backgroundColor = [UIColor colorWithRed:0.188 green:0.514 blue:0.984 alpha:1]; //arbitrary color 

कदम 3 इससे पहले कि आप मैं में एक सरणी वापस लौटाना होगा जैसा कि बताया जा

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
    { 
     // Delete something here 
    }]; 
    delete.backgroundColor = [UIColor redColor]; 

    UITableViewRowAction *more = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@" More " handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
    { 
     //Just as an example : 
     [self presentUIAlertControllerActionSheet]; 
    }]; 
    more.backgroundColor = [UIColor colorWithRed:0.188 green:0.514 blue:0.984 alpha:1]; 

    return @[delete, more]; //array with all the buttons you want. 1,2,3, etc... 
}  

आगे के संदर्भ के लिए:: LINK TO DOCUMENTATION


स्विफ्ट सिंटैक्स के लिए संपादित

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? { 

var delete = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in 
    //Do something 
}) 
delete.backgroundColor = UIColor.redColor() 

var more = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "More" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in 
    //Do something 
}) 
more.backgroundColor = UIColor.blueColor() 

    return [delete, more] 
} 
+0

खिताब संपादन के बारे में अपने सुझाव के लिए धन्यवाद:

यहाँ यह की स्विफ्ट 3 संस्करण है। लेकिन वास्तव में मैं अतिरिक्त बीटीएन सक्षम करने के लिए NSFetchedResultsController को अनुकूलित करने के बारे में कुछ करने की कोशिश कर रहा था। आपका उत्तर इस समस्या को ठीक करने का एक और समाधान प्रदान करता है लेकिन मेरा मूल इरादा नहीं है। आपके उत्तर के लिए फिर से धन्यवाद। – AlexWei

+0

शायद आप स्पष्ट कर सकते हैं तो @AlexWei मैं अपना जवाब संपादित करने के इच्छुक हूं। कारण मैं उलझन में हूं क्योंकि NSFetchedResultsController बस UITableView में प्रदर्शित करने के लिए कोर डेटा से जानकारी पुनर्प्राप्त करता है। एक्शन बटन यूआईटीबल व्यू का हिस्सा हैं जो नियंत्रक नहीं लाते हैं। यदि आप अपनी समस्या के लिए कोई संदर्भ लिंक या चित्र पोस्ट कर सकते हैं तो मैं आपको – soulshined

+1

में मदद करने के लिए बेहतर समझ सकता हूं ऐसा लगता है कि मैं पूरी तरह से गलत हूं। मुझे एहसास नहीं हुआ कि "एक्शन बटन UITableView का हिस्सा हैं नियंत्रक नहीं लाता"। मैंने सोचा कि बटन fetch नियंत्रक से संबंधित है। :( – AlexWei

10

सभी प्रशंसा @ करने के लिए nstance विधि तो अपना पूरा कोड निम्न सदृश चाहिए आत्माबद्ध स्वीकृत उत्तर।

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 
    let delete = UITableViewRowAction(style: .default, title: "Delete") { (action:UITableViewRowAction, indexPath:IndexPath) in 
     print("delete at:\(indexPath)") 
    } 
    delete.backgroundColor = .red 

    let more = UITableViewRowAction(style: .default, title: "More") { (action:UITableViewRowAction, indexPath:IndexPath) in 
     print("more at:\(indexPath)") 
    } 
    more.backgroundColor = .orange 

    return [delete, more] 
} 
+0

रूपांतरण के लिए धन्यवाद। – RichS

संबंधित मुद्दे