Өшіру және «Қосымша» түймешігіне жанап өту (iOS 7 бағдарламасындағы Mail бағдарламасында сияқты)

Пайдаланушы кесте көрінісінде (мысалы, iOS 7-дегі пошта бағдарламалары сияқты) ұяшықты жылжытқанда «көп» батырмасын қалай жасау керек?

Мен мұнда да, Cocoa Touch форумында да осы ақпаратты іздеп жүрмін, бірақ жауапты таба алмаймын және мен өзімнің шешімімнен гөрі ақылға қонымды деп үміттенемін.

Пайдаланушы кесте көрініс ұяшығын таңдайтын болса, бірден бірнеше өңдеу батырмасын көрсету үшін (ол әдепкі - жою түймешігі) көрсетілуін қалаймын. IOS 7 бағдарламасына арналған пошта бағдарламасында жою үшін жанап өтуге болады, бірақ көрсетілетін «КӨБІРЕК» түймешігі бар.

enter image description here

233
Мына жағдайды тексеріңіз: teehanlax.com/blog/reproducing- the-ios-7-mail-apps-interface және autaayout арқылы іске асырылғаным github.com/Jafared/ JASwipeCellExperiment
қосылды автор Alexis, көзі
қосылды автор null, көзі
iOS 11 нұсқасында үшінші тарап коды жоқ. менің жауап үшін төменге қарай жылжытыңыз
қосылды автор Lewis42, көзі
@GuyKahlonMatrix шешімі үшін жұмыс істегеніне рахмет. Бұл сұрақ көптеген Google іздеуде нәтиже болып табылады және адамдар түсініктемелері арқылы өз білімін алмастыруға мәжбүр болады, себебі кейбір жігіт бұл мәселені жабу және орнына демократия туралы уағыздаудың пайдалы екенін анықтады. Бұл орынға жақсы режимдер қажет.
қосылды автор Şafak Gezer, көзі
Егер сіз iOS 8-ді қолдана алсаңыз, төмендегі жауапты қалағаныңыз болады.
қосылды автор Johnny, көзі
@ ШафакГизер rowEditActionButtons түймелерінің енін қалай орнатуға болады
қосылды автор ArgaPK, көзі
@MonishBansal Bansal Бұл тақырыптағы біреуді көреді ( devforums.apple.com/message/860459#860459 Apple әзірлеуші ​​форумында) алға жылжыды және өздерінің іске асырылуын жасады. GitHub бағдарламасында қажетті нәрсені табуға болады: github.com/daria-kopaliani/DAContextMenuTableViewCont‌ ролик
қосылды автор Guy Kahlon, көзі
«Жою» батырмасын қосу үшін келесі екі функцияны іске асырамын. - (BOOL) tableView: (UITableView *) tableView canEditRowAtIndexPath: (NSIndexPath *) indexPath; - (void) tableView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) editingStyle forRowAtIndexPath: (NSIndexPath *) indexPath; Мен оған «Қосымша» батырмасын қосқым келеді.
қосылды автор Guy Kahlon, көзі
Менің ойымша, бұл оқулық көмектесе алады: raywenderlich.com/62435/…
қосылды автор César Abreu, көзі

20 жауаптар

Қалай жүзеге асыруға болады

IOS 8 бұл API-ді ашады. Осындай функционалдылық туралы кеңестер Бета 2-де бар.

Бірдеңе жұмыс істеу үшін, UITableView делегатыңызда келесі екі әдісті орындаңыз: қалаған нәтиже алу үшін (мысалы, мысалы).

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


Белгілі мәселелер

Құжатта tableView: commitEditingStyle: forRowAtIndexPath болып табылады:

«UITableViewRowAction пайдаланып өңдеу әрекеттеріне шақырылмайды - оның орнына әрекет өңдегіші шақырылады.»

Дегенмен, серпіліс онсыз жұмыс істемейді. Тіпті егер бұл әдіс бос болса да, ол әлі күнге дейін қажет. Бұл, ең алдымен, бета 2-дегі қате.


Көздер

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

Original Answer: https://stackoverflow.com/a/24540538/870028


Жаңарту:

Sample code with this working (In Swift): http://dropbox.com/s/0fvxosft2mq2v5m/DeleteRowExampleSwift.zip

Үлгі коды MasterViewController.swift бағдарламасында осы қарапайым әдісті қамтиды және осы әдіс арқылы OP экран суретте көрсетілген әрекетті аласыз:

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];
}
122
қосылды
Көп рақмет сізге. :) Сіздің жауапыңыз маған көп көмектесті
қосылды автор Somu, көзі
Ұстаушылар шақырылады, бірақ кейіннен «жабық» емес. Мұны істеудің айқын жолы жоқ па? Tableview ішіне endEditing: қоңырау шалу ештеңе істемейді.
қосылды автор Ben Lachman, көзі
Өз пікіріме жауап беру үшін. Objc ішіндегі tableView.editing = false ( NO ) деп аталады және ұяшық «жабу» болады.
қосылды автор Ben Lachman, көзі
Мен объективті жұмыс істемедім .. Мен жазған сол код. бірнеше кеңестерді ұсыныңыз.
қосылды автор Solid Soft, көзі
мұны жасады. Бірақ бұл неліктен болғанына сенімді емеспін. Бұл UITableViewController-мен UITViewController ішіндегі UITableView емес, менімен бірге жұмыс істейді.
қосылды автор Solid Soft, көзі
@Johnny Иә, мен айтқан. Қазір жұмыс істеймін UITableViewController мен жұмыс істеді. Қолдау көрсеткеніңе рахмет.
қосылды автор Solid Soft, көзі
Мәтіннің орнына белгішені қалай қосуға болады? Мәтінді жоюды қаламаймын, тек жою белгішесін алғым келеді. Мұны қаншалықты тез жетуге болады? Өтінемін көмектесіңіз
қосылды автор Alok Nair, көзі
Егер мен бұл жауапты iOS 8-ге дейін күрделі іске қосудан бұрын ғана көретін болсам!
қосылды автор fujianjin6471, көзі
Бұл өте қарапайым болуы мүмкін, бірақ мен жай ғана негіздер жабық екеніне көз жеткізгім келеді. UIViewController UITableViewDelegate протоколына сәйкес келе ме? Егер солай болса, сіз оны self.tableView.delegate = self арқылы тағайындайсыз ба; (немесе не?)?
қосылды автор Johnny, көзі
@Siegfoult Сіз іске асыруға тырысыңыз ба (бос қалдырса да) tableView: commitEditingStyle: forRowAtIndexPath :?
қосылды автор Johnny, көзі
@SolidSoft Сізде мысал бола алатын жоба бар ма? Мен мұны жақсартуға көмектесе аламын.
қосылды автор Johnny, көзі
@SolidSoft Кешіріңіз, мен сізге тегімді ұмытып кеттім.
қосылды автор Johnny, көзі
Бұл дұрыс деп ойлаймын, бірақ Xcod 6-GM-дегі жанбайтын қимыл жұмыс істемейді. EditActions әлі де кесте көрінісін өңдеу режиміне қою арқылы қол жеткізуге болады. Кез келген адам сол саусақты жұмыс істемейді деп тапты?
қосылды автор Siegfoult, көзі
Жақсы ақпарат
қосылды автор Gabox, көзі

IOS 8 пошта қолданбасы сияқты әртүрлі өтулерді және кеңейтілетін түймелерді қолдайтын мүмкін түймешіктерді іске қосу үшін жаңа кітапхана құрдым.

https://github.com/MortimerGoro/MGSwipeTableCell

Бұл кітапхана UITableViewCell жасау және оны iOS 5, iOS 6, iOS 7 және iOS 8 жүйелерінде тексеруге арналған әртүрлі тәсілдермен үйлесімді.

Мұнда кейбір өтулердің үлгісі:

Шекаралық өту:

Border transition

Клипті көшіру

Клипті көшіру

3D өтуі:

enter image description here

117
қосылды
Бұл таңғажайып кітапхана және ол өте жақсы, ол әлі де қолдауға ие.
қосылды автор confile, көзі
Ұлы жұмыс! Анимацияларды баптау үшін қоңырау шалу мүмкін болмас еді.
қосылды автор Pacu, көзі
@MortimerGoro Жақсы жұмыс адамы. Бұл жақсы көрінеді. Мен Android Project біреуінде ұқсас әсерді іске асыруға тырысамын. Маған Android-ге қалай жетуге болады?
қосылды автор Nitesh Khatri, көзі
Бұл параметрмен бірге VoiceOver көмегімен кейбір мәселелер бар. Әйтпесе, керемет жұмыс!
қосылды автор Kane Cheshire, көзі
Wow, айтарлықтай әсерлі жұмыс!
қосылды автор Ben Williams, көзі
Бұл өте badass bud .. Жай ғана жақсы, рахмет!
қосылды автор 0yeoj, көзі
iOS 8 + iPad құрылғысында, мен жай ғана серпіліс болмайды.
қосылды автор ScorpionKing2k5, көзі
@MortimerGoro, Мен «MGSwipeTableCel» l-файлымен жұмыс істедім, бірақ мәселе - үстелімді қайта жүктегенде, содан кейін сканерлеу түймесі жасырылған. Бұл мәселе бойынша кез келген жұмыс.
қосылды автор Ganesh Guturi, көзі
Ғажайып !!! Жай өтіп, фантастикалық анимацияларға дауыс бере алмайсыз !!!
қосылды автор Z.pyyyy, көзі
Ұлы жұмыс! Бұл маған көп көмектеседі және көп уақытты үнемдейді.
қосылды автор Moin Uddin, көзі

Джоннаның жауабы - жаңарудың дұрыс түрі. Мен жай ғана мұны жаңадан бастағандарға түсіндіру үшін объективті-c етіп қосып жатырмыз (және Swift синтаксисін білмейтіндерден :)

Uitableviewdelegate деп мәлімдегеніңізге және келесі әдістерге ие екеніңізге көз жеткізіңіз:

 -(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...
    }
68
қосылды
canEditRowAtIndexPath еске маңызды
қосылды автор Heckscheibe, көзі
Ұяшықты сканерлегеннен кейін кестені қайтадан жүктеп алсам, сол батырмалардың көрінетін не жасырылған ба?
қосылды автор Ganesh Guturi, көзі

Бұл жеке (өте күлкілі) жеке API.

Келесі екі әдіс жеке болып табылады және UITableView делегатына жіберіледі:

-(NSString *)tableView:(UITableView *)tableView titleForSwipeAccessoryButtonForRowAtIndexPath:(NSIndexPath *)indexPath;
-(void)tableView:(UITableView *)tableView swipeAccessoryButtonPushedForRowAtIndexPath:(NSIndexPath *)indexPath;

Олар өте түсінікті.

25
қосылды
Apple бұл мүмкіндікті iOS 8 арқылы ашты. Johnny's төмендегі жауапты қараңыз.
қосылды автор Siegfoult, көзі

Джоннидің жауабын жақсарту үшін, оны жалпыға қолжетімді API арқылы төмендегідей орындау мүмкін:

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

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

    let deleteRowAction = UITableViewRowAction(style: UITableViewRowActionStyle.default, title: "Delete", handler:{action, indexpath in
        print("DELETE•ACTION");
    });

    return [deleteRowAction, moreRowAction];
}
23
қосылды
Кодыңызды Swift 3-ке жаңартыңыз ба? Рахмет
қосылды автор bibscy, көзі
рахмет жақсы жұмыс істейді.
қосылды автор Shahbaz Akram, көзі

Алма сізге қажет нәрсені беретінге дейін күте алмайсың деп үміттенемін? Мәселен менің таңдауым бар.

Өзгертпелі ұяшықты жасаңыз. Онда екі ниву бар

1. upper
2. lower

Төменгі көріністе сізге қажет батырмаларды қосыңыз. Өз іс-әрекеттерімен айналысыңыз     кез-келген басқа ХБЕС сияқты. анимация уақытын, стилін және кез келген нәрсені шеше аласыз.

енді үстіңгі көрініске қосыңыз және жүгіртпе қимылда төменгі көріністі ашыңыз. Мен бұған дейін және оның ең қарапайым нұсқасын өзіме байланысты жасадым.

Бұл көмекке үміттенеміз.

17
қосылды

Бұл стандартты SDK арқылы мүмкін емес. Дегенмен, Mail.app ішіндегі мінез-құлқын көп немесе кем көретін 3-ші тараптың түрлі шешімдері бар. Олардың кейбіреулері (мысалы, MCSwipeTableViewCell , DAContextMenuTableViewController , RMSwipeTableViewCell ) қимыл танғыштарын пайдаланып, олардың кейбіреулері (мысалы, SWTableViewCell ) екінші UISScrollView стандартты UITableViewCellScrollView UITableViewCell жеке ішкі көрінісі) және олардың кейбіреулері UITableViewCellScrollView әрекетін өзгертеді.

Маған ұнайтын соңғы әдіс өте ұнайды, өйткені сенсорлық өңдеу ең табиғи сезінеді. Атап айтқанда, MSCMoreOptionTableViewCell жақсы. Сіздің таңдауыңыз сіздің нақты қажеттіліктеріңізге байланысты өзгеруі мүмкін (сізге iOS 6 үйлесімділігі және т.б. қажет пе, солдан оңға табуға керек пе). Сондай-ақ, бұл тәсілдердің көпшілігі ауыртпалықты тудырады: Apple корпорациясы UITableViewCell бағыныңқы көрініс иерархиясында өзгертулер енгізсе, болашақта iOS нұсқасында оңай бұзылуы мүмкін.

7
қосылды

Кез-келген кітапхананы пайдаланбай, Swift 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]
    }

}
7
қосылды

Пайдаланушы ұяшықты сына бастаған кезде шақырылатын UITableViewCell және subclass әдісі willTransitionToState: (UITableViewCellStateMask) . state жалаушалары Жою түймешігі көрсетілуін білуге ​​мүмкіндік береді және сонда «Қосымша» батырмасын көрсетеді/жасырады.

Unfortunately this method gives you neither the width of the Delete button nor the animation time. So you need to observer & hard-code your More button's frame and animation time into your code (I personally think Apple needs to do something about this).

6
қосылды
«Мен бұл туралы Apple-ті бір нәрсе істеуі керек деп ойлаймын». Мен келісемін. Сіз оларға қате туралы есеп/мүмкіндік сұрауын жаздыңыз ба?
қосылды автор Tafkadasoh, көзі

Жылдам бағдарламалау үшін

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
  if editingStyle == UITableViewCellEditingStyle.Delete {
    deleteModelAt(indexPath.row)
    self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
  }
  else if editingStyle == UITableViewCellEditingStyle.Insert {
    println("insert editing action")
  }
}

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? {
  var archiveAction = UITableViewRowAction(style: .Default, title: "Archive",handler: { (action: UITableViewRowAction!, indexPath: NSIndexPath!) in
       //maybe show an action sheet with more options
        self.tableView.setEditing(false, animated: false)
      }
  )
  archiveAction.backgroundColor = UIColor.lightGrayColor()

  var deleteAction = UITableViewRowAction(style: .Normal, title: "Delete",
      handler: { (action: UITableViewRowAction!, indexPath: NSIndexPath!) in
        self.deleteModelAt(indexPath.row)
        self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic);
      }
  );
  deleteAction.backgroundColor = UIColor.redColor()

  return [deleteAction, archiveAction]
}

func deleteModelAt(index: Int) {
  //... delete logic for model
}
4
қосылды
@bibscy сізді редакциялауды ұсынуға шақырамыз. Ұзақ уақыт бойы жылдамдықты пайдаланбаңыз, сондықтан дұрыс синтаксистің қандай екенін білмеңіз
қосылды автор Michael Yagudaev, көзі
Swift 3 кодын жаңартуды сұрай аласыз ба?
қосылды автор bibscy, көзі

IOS 11 нұсқасы бойынша ол UITableViewDelegate ішінде қол жетімді. Төменде кейбір үлгі коды бар:

- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath {
    UIContextualAction *delete = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive
                                                                         title:@"DELETE"
                                                                       handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
                                                                           NSLog(@"index path of delete: %@", indexPath);
                                                                           completionHandler(YES);
                                                                       }];

    UIContextualAction *rename = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal
                                                                         title:@"RENAME"
                                                                       handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
                                                                           NSLog(@"index path of rename: %@", indexPath);
                                                                           completionHandler(YES);
                                                                       }];

    UISwipeActionsConfiguration *swipeActionConfig = [UISwipeActionsConfiguration configurationWithActions:@[rename, delete]];
    swipeActionConfig.performsFirstActionWithFullSwipe = NO;

    return swipeActionConfig;
}

Сондай-ақ, қол жетімді:

- (UISwipeActionsConfiguration *) tableView: (UITableView *) tableView жетекшіSwipeActionsConfigurationForRowAtIndexPath: (NSIndexPath *) indexPath;

Docs: https://developer.apple.com/documentation/uikit/uitableviewdelegate/2902367-tableview?language=objc

3
қосылды

Мен бірдей функционалдылықты қосымшаға қосуды армандайтынмын және әр түрлі оқулықтардан өткеннен кейін ( UITableViewRowAction класына ие екенін білдім. ыңғайлы.

Кесте диаграммасының boilerpoint әдісін келесіге өзгертуіңіз керек:

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?  {
   //1   
    var shareAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Share" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in
   //2
    let shareMenu = UIAlertController(title: nil, message: "Share using", preferredStyle: .ActionSheet)

    let twitterAction = UIAlertAction(title: "Twitter", style: UIAlertActionStyle.Default, handler: nil)
    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil)

    shareMenu.addAction(twitterAction)
    shareMenu.addAction(cancelAction)


    self.presentViewController(shareMenu, animated: true, completion: nil)
    })
   //3
    var rateAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Rate" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in
   //4
    let rateMenu = UIAlertController(title: nil, message: "Rate this App", preferredStyle: .ActionSheet)

    let appRateAction = UIAlertAction(title: "Rate", style: UIAlertActionStyle.Default, handler: nil)
    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil)

    rateMenu.addAction(appRateAction)
    rateMenu.addAction(cancelAction)


    self.presentViewController(rateMenu, animated: true, completion: nil)
    })
   //5
    return [shareAction,rateAction]
  }

Бұл туралы көбірек білу үшін Бұл сайт . Apple компаниясының өзіңіздің құжаттамаңыз өң түсін өзгерту үшін өте пайдалы:

Әрекет түймешігінің өң түсін.

     

Декларацияobjective-c@property (nonatomic, copy) UIColor   * backgroundColor Талқылау Бұл түймені сіздің түйме үшін өң түсін анықтау үшін пайдаланыңыз. Егер сіз мәнді көрсетпесеңіз   бұл сипат, UIKit параметрінде мәнге негізделген әдепкі мәнді тағайындайды   стиль сипаты.

     

Қол жетімділік iOS 8.0 және одан кейінгі нұсқаларында қол жетімді.

Егер сіз түйменің қаріпін өзгертуді қаласаңыз, ол сәл күрделірек. Мен басқа жазбаны SO бойынша. Кодты және сілтемемен қамтамасыз ету үшін, оларда пайдаланылатын код бар. Түймешіктің көрінісін өзгерту керек. Tableviewcell-ге нақты сілтеме жасауыңыз керек, әйтпесе сіздің бағдарламаңыздағы түйменің көрінісін өзгерте аласыз (мен оны қаламадым, бірақ сіз білмеймін :))

Мақсаты:

+ (void)setupDeleteRowActionStyleForUserCell {

    UIFont *font = [UIFont fontWithName:@"AvenirNext-Regular" size:19];

    NSDictionary *attributes = @{NSFontAttributeName: font,
                      NSForegroundColorAttributeName: [UIColor whiteColor]};

    NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString: @"DELETE"
                                                                          attributes: attributes];

    /*
     * We include UIView in the containment hierarchy because there is another button in UserCell that is a direct descendant of UserCell that we don't want this to affect.
     */
    [[UIButton appearanceWhenContainedIn:[UIView class], [UserCell class], nil] setAttributedTitle: attributedTitle
                                                                                          forState: UIControlStateNormal];
}

Swift:

    //create your attributes however you want to
    let attributes = [NSFontAttributeName: UIFont.systemFontOfSize(UIFont.systemFontSize())] as Dictionary!            

   //Add more view controller types in the []
    UIButton.appearanceWhenContainedInInstancesOfClasses([ViewController.self])

Бұл IMHO-ның ең қарапайым және көп ағынды нұсқасы. Бұл көмектеседі деп үміттенемін.

Жаңарту: Swift 3.0 нұсқасы:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    var shareAction:UITableViewRowAction = UITableViewRowAction(style: .default, title: "Share", handler: {(action, cellIndexpath) -> Void in
        let shareMenu = UIAlertController(title: nil, message: "Share using", preferredStyle: .actionSheet)

        let twitterAction = UIAlertAction(title: "Twitter", style: .default, handler: nil)
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

        shareMenu.addAction(twitterAction)
        shareMenu.addAction(cancelAction)


        self.present(shareMenu,animated: true, completion: nil)
    })

    var rateAction:UITableViewRowAction = UITableViewRowAction(style: .default, title: "Rate" , handler: {(action, cellIndexpath) -> Void in
       //4
        let rateMenu = UIAlertController(title: nil, message: "Rate this App", preferredStyle: .actionSheet)

        let appRateAction = UIAlertAction(title: "Rate", style: .default, handler: nil)
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

        rateMenu.addAction(appRateAction)
        rateMenu.addAction(cancelAction)


        self.present(rateMenu, animated: true, completion: nil)
    })
   //5
    return [shareAction,rateAction]
}
3
қосылды
@Septronic Сіз кодты Swift 3-ке жаңартыңыз ба? shareMenu. addAction әдісін қабылдамайды. Рахмет
қосылды автор bibscy, көзі
@bibscy Мен жылдам нұсқаны қостым. Сізге төлқұжат үшін ақы қажет пе? sharemenu бұл UIAlertController ғана, сондықтан ол акцияны қабылдауы керек. Оны пайдаланып, сәттілікке жол берсеңіз, маған хабарлаңыз :)
қосылды автор Septronic, көзі
@GuyKahlon иә, сіз сол және оң жаққа жылжу мәселесіне қатысты дұрыссыздарсыз, мен MGSwipeTableCell-ды көбірек теңшеу үшін ең жақсы деп санаймын. Apple-дің ең күрделі нұсқасы емес, бірақ қарапайым тапсырмалар үшін оны тікелей алға жылжыды.
қосылды автор Septronic, көзі
Жауабыңызға рахмет, көптеген әзірлеушілерге көмектесетініне сенімдімін. Ия, дұрыс, шын мәнінде Apple бұл шешімді iOS 8-тен қамтамасыз етеді. Бірақ, өкінішке орай, бұл шешімді толық функционалдылықты қамтамасыз етпейді. Мысалы, Apple поштасының бағдарламасында сіз Apple тарапынан ағымдағы API-мен екі жақтан да (сол жақтан біреуі, оң жақтан біреуі) екі жаққа да түймелерді қоса алмайсыз, сондай-ақ ағымдағы API қолдамайды. пайдаланушы əр жағына қарай созылса, әдепкі әрекет. Қазіргі уақытта IMHO үшін ең жақсы шешім - ашық көзі MGSwipeTableCell.
қосылды автор Guy Kahlon, көзі

нақты Swift 3 жауап

Бұл сізге қажет ТЕК функциясы. Ерекше әрекеттер үшін CanEdit немесе CommitEditingStyle функцияларының қажеті жоқ.

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]
}
3
қосылды

БҰЛ сізге көмектеседі.

-(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...
    }
3
қосылды

There is an amazing library called SwipeCellKit, it should gain more acknowledgement. In my opinion it is cooler than MGSwipeTableCell. The latter doesn't completely replicate the behavior of the Mail app's cells whereas SwipeCellKit does. Have a look

1
қосылды
@ horseshoe7 бұл ғажайып. Мен SwipeCellKit-ды пайдаланған кезде ешқашан ешқандай жағдайға қатыспадым. Өйткені, қандай да бір байланыс жасуша дерексіз өзгерістерге байланысты осындай ерекше жағдайға ие болуы мүмкін?
қосылды автор Andrey Chernukha, көзі
Мен SwipeCellKit әрекетін сынап көрдім және осы Ерекшеліктердің бірін алғанға дейін әсер етті, себебі кесте көрінісін жаңарту алдындағы жолдар саны +/- жолдардағы өзгерістерден кейінгідей емес еді. Мәселе мынада, менің деректер жиынтығын ешқашан өзгертпедім. Сондықтан егер бұл алаңдатпайтын болса, мен не екенін білмеймін. Сондықтан оны қолданудан бас тарттым және жаңа UITableViewDelegate әдістерін қолдандым. Егер сізге көбірек теңшеу қажет болса, willBeginEditingRowAt: ....
қосылды автор horseshoe7, көзі

Swift 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
қосылды

Мұнда жеке API-ді қамтымайтын немесе өзіңіздің жүйеңізді жасамайтын әрекетті орындаудың бірнеше нәзік тәсілі. Сіз Apple-ді бұзбайтын ставкаларыңызды хеджирлеп ​​жатырсыз және олар осы кодтың бірнеше жолын ауыстыра алатын API-ты босататынына үміттенеміз.

  1. KVO self.contentView.superview.layer.sublayer. Do this in init. This is the UIScrollView's layer. You can't KVO 'subviews'.
  2. When subviews changes, find the delete confirmation view within scrollview.subviews. This is done in the observe callback.
  3. Double the size of that view and add a UIButton to the left of its only subview. This is also done in the observe callback. The only subview of the delete confirmation view is the delete button.
  4. (optional) The UIButton event should look up self.superview until it finds a UITableView and then call a datasource or delegate method you create, such as tableView:commitCustomEditingStyle:forRowAtIndexPath:. You may find the indexPath of the cell by using [tableView indexPathForCell:self].

Сондай-ақ, бұл стандартты кесте көрінісін өңдеу делегінің кері шақыруларын орындауды талап етеді.

static char kObserveContext = 0;

@implementation KZTableViewCell {
    UIScrollView *_contentScrollView;
    UIView *_confirmationView;
    UIButton *_editButton;
    UIButton *_deleteButton;
}

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        _contentScrollView = (id)self.contentView.superview;

        [_contentScrollView.layer addObserver:self
             forKeyPath:@"sublayers"
                options:0
                context:&kObserveContext];

        _editButton = [UIButton new];
        _editButton.backgroundColor = [UIColor lightGrayColor];
        [_editButton setTitle:@"Edit" forState:UIControlStateNormal];
        [_editButton addTarget:self
                        action:@selector(_editTap)
              forControlEvents:UIControlEventTouchUpInside];

    }
    return self;
}

-(void)dealloc {
    [_contentScrollView.layer removeObserver:self forKeyPath:@"sublayers" context:&kObserveContext];
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if(context != &kObserveContext) {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        return;
    }
    if(object == _contentScrollView.layer) {
        for(UIView * view in _contentScrollView.subviews) {
            if([NSStringFromClass(view.class) hasSuffix:@"ConfirmationView"]) {
                _confirmationView = view;
                _deleteButton = [view.subviews objectAtIndex:0];
                CGRect frame = _confirmationView.frame;
                CGRect frame2 = frame;
                frame.origin.x -= frame.size.width;
                frame.size.width *= 2;
                _confirmationView.frame = frame;

                frame2.origin = CGPointZero;
                _editButton.frame = frame2;
                frame2.origin.x += frame2.size.width;
                _deleteButton.frame = frame2;
                [_confirmationView addSubview:_editButton];
                break;
            }
        }
        return;
    }
}

-(void)_editTap {
    UITableView *tv = (id)self.superview;
    while(tv && ![tv isKindOfClass:[UITableView class]]) {
        tv = (id)tv.superview;
    }
    id delegate = tv.delegate;
    if([delegate respondsToSelector:@selector(tableView:editTappedForRowWithIndexPath:)]) {
        NSIndexPath *ip = [tv indexPathForCell:self];
       //define this in your own protocol
        [delegate tableView:tv editTappedForRowWithIndexPath:ip];
    }
}
@end
1
қосылды
Аяқталды. Мүмкін, екі немесе екі қате болуы мүмкін, бірақ сіз өзіңізді алайық.
қосылды автор xtravar, көзі
Үлгі кодын бере алатын болсаңыз, рақмет
қосылды автор Guy Kahlon, көзі
Көмектесуге рақмет
қосылды автор Guy Kahlon, көзі

Жылдам 4

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let delete = UIContextualAction(style: .destructive, title: "Delete") { (action, sourceView, completionHandler) in
        print("index path of delete: \(indexPath)")
        completionHandler(true)
    }
    let rename = UIContextualAction(style: .normal, title: "Edit") { (action, sourceView, completionHandler) in
        print("index path of edit: \(indexPath)")
        completionHandler(true)
    }
    let swipeActionConfig = UISwipeActionsConfiguration(actions: [rename, delete])
    swipeActionConfig.performsFirstActionWithFullSwipe = false
    return swipeActionConfig
}
0
қосылды
кодтардағы бастапқы көрініс дегеніміз не? бұл белгіше немесе кескін бе?
қосылды автор Saeed Rahmatolahi, көзі

Мұнда бір қарапайым шешім. UITableViewCell ішіндегі пайдаланушы UIView көрсетуге және жасыруға қабілетті. Логиканы бейнелеу UITableViewCell, BaseTableViewCell кеңейтілген ішкі сыныпта бар.

BaseTableViewCell.h

#import 

@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 бағдарламасынан кесте көрініс ұяшығын қарапайым түрде кеңейтіңіз.

Келесі, UITableViewDelegate іске асыратын UIViewController ішіне сол және оң жақ саусақтарды өңдеу үшін екі қимыл тану құралын жасаңыз.

- (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)];
    }
}

Енді, UITableViewDelegate ішіндегі cellForRowAtIndexPath ішіндегі пайдаланушы UIView жасай аласыз және оны ажыратылған ұяшыққа тіркей аласыз.

-(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 қолданбасын жүктеудің бұл жолы тек осы мысал үшін. Қалағаныңызша басқарыңыз.

0
қосылды

Бірнеше деректерді көрсету үшін tableViewCell пайдаланылды, ұяшықта оңға-солға қарай() екі түймені көрсететіндіктен кейін екі әдісті көрсетеді, біріншісі ApproveFunc, бір дәлелді қабылдайды және екіншісі - RejectFunc, ол да бір дәлел алады.

enter image description here

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
        let Approve = UITableViewRowAction(style: .normal, title: "Approve") { action, index in

            self.ApproveFunc(indexPath: indexPath)
        }
        Approve.backgroundColor = .green

        let Reject = UITableViewRowAction(style: .normal, title: "Reject") { action, index in

            self.rejectFunc(indexPath: indexPath)
        }
        Reject.backgroundColor = .red



        return [Reject, Approve]
    }

    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    func ApproveFunc(indexPath: IndexPath) {
        print(indexPath.row)
    }
    func rejectFunc(indexPath: IndexPath) {
        print(indexPath.row)
    }
0
қосылды
Сіз оқырманнан үйренуге болатын жауабыңызға бірнеше түсініктеме бере аласыз ба?
қосылды автор Nico Haase, көзі