हटाने और "अधिक" बटन पर स्वाइप करें (जैसे IOS 7 पर मेल ऐप में)


Answers

कैसे कार्यान्वित करें

ऐसा लगता है कि आईओएस 8 इस एपीआई को खोलता है। ऐसी कार्यक्षमता का संकेत बीटा 2 में मौजूद है

कुछ काम करने के लिए, अपने UITableView के प्रतिनिधि पर इच्छित दो प्रकार के तरीकों को लागू करें (उदाहरण के लिए सारांश देखें)।

- tableView:editActionsForRowAtIndexPath:
- tableView:commitEditingStyle:forRowAtIndexPath:


ज्ञात पहलु

प्रलेखन कहते हैं टेबलव्यूः कमेटिंग शैली: forRowAtIndexPath है:

"UITableViewRowAction का उपयोग करते हुए संपादन कार्यों के लिए नहीं बुलाया गया - ऐक्शन के हेन्डलर को इसके बजाय लागू किया जाएगा।"

हालांकि, स्वाइपिंग इसके बिना काम नहीं करता है यहां तक ​​कि अगर विधि स्टब रिक्त है, अभी भी इसकी आवश्यकता है, अभी के लिए। यह सबसे स्पष्ट रूप से बीटा 2 में एक बग है


सूत्रों का कहना है

https://twitter.com/marksands/status/481642991745265664 https://gist.github.com/marksands/76558707f583dbb8f870

मूल उत्तर: https://stackoverflow.com/a/24540538/870028


अद्यतन करें:

इस काम के साथ नमूना कोड (स्विफ्ट में): http://dropbox.com/s/0fvxosft2mq2v5m/DeleteRowExampleSwift.zip

नमूना कोड में MasterViewController.swift में यह आसानी से अनुपालन पद्धति है, और केवल इस पद्धति के साथ आप ओपी स्क्रीनशॉट में दिखाए गए व्यवहार प्राप्त करते हैं:

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

    var moreRowAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "More", handler:{action, indexpath in
        println("MORE•ACTION");
    });
    moreRowAction.backgroundColor = UIColor(red: 0.298, green: 0.851, blue: 0.3922, alpha: 1.0);

    var deleteRowAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete", handler:{action, indexpath in
        println("DELETE•ACTION");
    });

    return [deleteRowAction, moreRowAction];
}
Question

जब उपयोगकर्ता तालिका देखने में एक सेल को स्वाइप करता है तो "अधिक" बटन कैसे बना सकता है (जैसे आईओएस 7 में मेल ऐप)

मैं इस जानकारी को और यहाँ कोका टच फोरम में देख रहा हूं, लेकिन मुझे इसका जवाब नहीं मिल पाया है और मैं किसी से बेहतर उम्मीद कर रहा हूं कि मैं खुद को समाधान दे सकता हूं।

मैं चाहूंगा कि जब उपयोगकर्ता एक से अधिक संपादन बटन को प्रदर्शित करने के लिए एक टेबल व्यू सेल को स्वाइप करेगा (वह डिफॉल्ट होता है तो हटाएं बटन)। आईओएस 7 के लिए मेल ऐप में आप हटाने के लिए ज़ोर से मारना सकते हैं, लेकिन एक "अधिक" बटन दिखाई देता है जो दिखाता है।




मानक एसडीके का उपयोग करना संभव नहीं है हालांकि ऐसे कई तृतीय पक्ष समाधान हैं जो Mail.app में अधिक या कम व्यवहार को अनुकरण करते हैं। उनमें से कुछ (जैसे MCSwipeTableViewCell , DacontextMenuTableViewController , RMSwipeTableViewCell ) इशारे recognizers का उपयोग कर swipes का पता लगाते हैं, उनमें से कुछ (जैसे SWTableViewCell ) ने मानक UITableViewCellScrollView ( UITableViewCellScrollView निजी उपदृश्य ) के नीचे एक दूसरा UISScrollView डाल दिया और उनमें से कुछ UITableViewCellScrollView के व्यवहार को संशोधित करते हैं।

मुझे आखिरी दृष्टिकोण पसंद है क्योंकि स्पर्श से निपटने का सबसे स्वाभाविक लगता है विशेष रूप से, MSCMoreOptionTableViewCell अच्छा है आपकी पसंद आपकी विशिष्ट ज़रूरतों के आधार पर अलग-अलग हो सकती है (चाहे आप को बाएं से दाएं पैन की आवश्यकता हो, चाहे आप आईओएस 6 संगतता की ज़रूरत हो, आदि)। यह भी ध्यान रखें कि इन दृष्टिकोणों में से अधिकांश बोझ के साथ आते हैं: यदि भविष्य में एप्पल UITableViewCell सबव्यू पदानुक्रम में बदलाव करता है तो वे आसानी से भावी आईओएस संस्करण में तोड़ सकते हैं।




यह आपकी सहायता कर सकता है

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewRowAction *button = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 1" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
    {
        NSLog(@"Action to perform with Button 1");
    }];
    button.backgroundColor = [UIColor greenColor]; //arbitrary color
    UITableViewRowAction *button2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 2" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
                                    {
                                        NSLog(@"Action to perform with Button2!");
                                    }];
    button2.backgroundColor = [UIColor blueColor]; //arbitrary color

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

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
// you need to implement this method too or nothing will work:

}
 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES; //tableview must be editable or nothing will work...
    }



वहाँ बुलाया एक अद्भुत पुस्तकालय है SwipeCellKit, यह अधिक पावती हासिल करना चाहिए। मेरी राय में यह तुलना में ज्यादा अच्छे है MGSwipeTableCell। बाद पूरी तरह से मेल ऐप की कोशिकाओं के व्यवहार जबकि दोहराने नहीं करता SwipeCellKitहै। एक नज़र देख लो




वास्तविक स्विफ्ट 3 उत्तर

यह आपको केवल फ़ंक्शन की ज़रूरत है कस्टम क्रियाओं के लिए आपको सीएएनडीडिट या कमेटिंग की जरूरत नहीं है।

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let action1 = UITableViewRowAction(style: .default, title: "Action1", handler: {
        (action, indexPath) in
        print("Action1")
    })
    action1.backgroundColor = UIColor.lightGray
    let action2 = UITableViewRowAction(style: .default, title: "Action2", handler: {
        (action, indexPath) in
        print("Action2")
    })
    return [action1, action2]
}



जॉनी का जवाब ऊपर उठाने के लिए सही है। मैं सिर्फ उद्देश्य-सी में इसे नीचे जोड़ रहा हूं ताकि शुरुआती (और हम में से जो स्विफ्ट सिंटैक्स सीखने से इनकार करते हैं) को स्पष्ट कर सकें।

सुनिश्चित करें कि आप यूटिफ़ेबल एडिगेट घोषित करते हैं और निम्नलिखित विधियां हैं:

 -(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewRowAction *button = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 1" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
    {
        NSLog(@"Action to perform with Button 1");
    }];
    button.backgroundColor = [UIColor greenColor]; //arbitrary color
    UITableViewRowAction *button2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 2" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
                                    {
                                        NSLog(@"Action to perform with Button2!");
                                    }];
    button2.backgroundColor = [UIColor blueColor]; //arbitrary color

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

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
// you need to implement this method too or nothing will work:

}
 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES; //tableview must be editable or nothing will work...
    }



यहाँ एक सरल उपाय है। यह प्रदर्शित करने और UITableViewCell अंदर कस्टम UIView को छिपाने के लिए सक्षम है। प्रदर्शित तर्क UITableViewCell, BaseTableViewCell से बढ़ाया वर्ग के भीतर निहित है।

BaseTableViewCell.h

#import <UIKit/UIKit.h>

@interface BaseTableViewCell : UITableViewCell

@property(nonatomic,strong)UIView* customView;

-(void)showCustomView;

-(void)hideCustomView;

@end

BaseTableViewCell.M

#import "BaseTableViewCell.h"

@interface BaseTableViewCell()
{
    BOOL _isCustomViewVisible;
}

@end

@implementation BaseTableViewCell

- (void)awakeFromNib {
    // Initialization code
}

-(void)prepareForReuse
{
    self.customView = nil;
    _isCustomViewVisible = NO;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

-(void)showCustomView
{
    if(nil != self.customView)
    {
        if(!_isCustomViewVisible)
        {
            _isCustomViewVisible = YES;

            if(!self.customView.superview)
            {
                CGRect frame = self.customView.frame;
                frame.origin.x = self.contentView.frame.size.width;
                self.customView.frame = frame;
                [self.customView willMoveToSuperview:self.contentView];
                [self.contentView addSubview:self.customView];
                [self.customView didMoveToSuperview];
            }

            __weak BaseTableViewCell* blockSelf = self;
            [UIView animateWithDuration:.5 animations:^(){

                for(UIView* view in blockSelf.contentView.subviews)
                {
                    CGRect frame = view.frame;
                    frame.origin.x = frame.origin.x - blockSelf.customView.frame.size.width;
                    view.frame = frame;
                }
            }];
        }
    }
}

-(void)hideCustomView
{
    if(nil != self.customView)
    {
        if(_isCustomViewVisible)
        {
            __weak BaseTableViewCell* blockSelf = self;
            _isCustomViewVisible = NO;
            [UIView animateWithDuration:.5 animations:^(){
                for(UIView* view in blockSelf.contentView.subviews)
                {
                    CGRect frame = view.frame;
                    frame.origin.x = frame.origin.x + blockSelf.customView.frame.size.width;
                    view.frame = frame;
                }
            }];
        }
    }
}

@end

इस कार्यक्षमता प्राप्त करने के लिए, सरल BaseTableViewCell से अपने तालिका दृश्य सेल का विस्तार।

इसके बाद, अंदर UIViewController, जो UITableViewDelegate लागू, बाएँ और दाएँ स्वाइप को संभालने के लिए दो इशारा recognizers पैदा करते हैं।

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self.tableView registerNib:[UINib nibWithNibName:CUSTOM_CELL_NIB_NAME bundle:nil] forCellReuseIdentifier:CUSTOM_CELL_ID];

    UISwipeGestureRecognizer* leftSwipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipe:)];
    leftSwipeRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.tableView addGestureRecognizer:leftSwipeRecognizer];

    UISwipeGestureRecognizer* rightSwipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipe:)];
    rightSwipeRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    [self.tableView addGestureRecognizer:rightSwipeRecognizer];
}

दो से कड़ी चोट संचालकों को जोड़ने

- (void)handleLeftSwipe:(UISwipeGestureRecognizer*)recognizer
{
    CGPoint point = [recognizer locationInView:self.tableView];
    NSIndexPath* index = [self.tableView indexPathForRowAtPoint:point];

    UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:index];

    if([cell respondsToSelector:@selector(showCustomView)])
    {
        [cell performSelector:@selector(showCustomView)];
    }
}

- (void)handleRightSwipe:(UISwipeGestureRecognizer*)recognizer
{
    CGPoint point = [recognizer locationInView:self.tableView];
    NSIndexPath* index = [self.tableView indexPathForRowAtPoint:point];

    UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:index];

    if([cell respondsToSelector:@selector(hideCustomView)])
    {
        [cell performSelector:@selector(hideCustomView)];
    }
}

अब, cellForRowAtIndexPath अंदर, UITableViewDelegate की, आप कस्टम UIView बना सकते हैं और dequeued सेल में अटैच कर सकते हैं।

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCellTableViewCell* cell = (CustomCellTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"CustomCellTableViewCell" forIndexPath:indexPath];

    NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"CellCustomView"
                                                      owner:nil
                                                    options:nil];

    CellCustomView* customView = (CellCustomView*)[ nibViews objectAtIndex: 0];

    cell.customView = customView;

    return cell;
}

बेशक, कस्टम UIView की लोडिंग की इस तरह से सिर्फ इस उदाहरण के लिए है। यह प्रबंधित के रूप में आप चाहते हैं।




किसी पुस्तकालय का उपयोग किए बिना स्विफ्ट 3 संस्करण कोड:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        tableView.tableFooterView = UIView(frame: CGRect.zero) //Hiding blank cells.
        tableView.separatorInset = UIEdgeInsets.zero
        tableView.dataSource = self
        tableView.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return 4
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)

        return cell
    }

    //Enable cell editing methods.
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

        return true
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    }

    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

        let more = UITableViewRowAction(style: .normal, title: "More") { action, index in
            //self.isEditing = false
            print("more button tapped")
        }
        more.backgroundColor = UIColor.lightGray

        let favorite = UITableViewRowAction(style: .normal, title: "Favorite") { action, index in
            //self.isEditing = false
            print("favorite button tapped")
        }
        favorite.backgroundColor = UIColor.orange

        let share = UITableViewRowAction(style: .normal, title: "Share") { action, index in
            //self.isEditing = false
            print("share button tapped")
        }
        share.backgroundColor = UIColor.blue

        return [share, favorite, more]
    }

}



स्विफ्ट 4 और IOS 11+

@available(iOS 11.0, *)
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {

    let delete = UIContextualAction(style: .destructive, title: "Delete") { _, _, handler in

        handler(true)
        // handle deletion here
    }

    let more = UIContextualAction(style: .normal, title: "More") { _, _, handler in

        handler(true)
        // handle more here
    }

    return UISwipeActionsConfiguration(actions: [delete, more])
}



मुझे उम्मीद है कि आप तक इंतजार नहीं कर सकते जब तक कि आप को सही नहीं चाहिए, तब तक सेब आपको देता है? तो यहाँ मेरा विकल्प है

कस्टम कक्ष बनाएं इसमें दो यूविज़ हैं

1. upper
2. lower

निचले दृश्य में, जो भी बटन आपको आवश्यक हैं उसे जोड़ें। किसी भी अन्य IBActions की तरह उसके कार्यों को डील करें आप एनीमेशन समय, शैली और कुछ भी तय कर सकते हैं।

अब ऊपरी दृश्य के लिए एक यूआईस्वाइपगेयर जोड़ें और स्वाइप इशारे पर अपने निचले दृश्य को प्रकट करें। मैंने यह पहले किया है और इसका सबसे आसान विकल्प जहां तक ​​मेरा संबंध है

उम्मीद है कि मदद