tilføje ekstra knapper i UITableView stryg

I øjeblikket bruger jeg NSFetchedResultsController til at håndtere tableviews.
Jeg spekulerer på, er der nogen måde at tilføje ekstra knapper som de slet-knappen ved at stryge til operation?

Jeg tænker, at det underklasse. Men finder intet, der er relevante i hjælp-dokumenter til mine problemer.

På forhånd tak.

OriginalForfatteren AlexWei | 2015-01-09

2 svar

  1. 47

    Din titel er misvisende. NSFetchedResultsController har ingen relevans til dit endelige mål. Subclassing ville blot skabe mere arbejde end nødvendigt, hvad du ønsker at se i er UITableViewRowAction. Dette håndterer meget nemt & ligeledes at den nye UIAlertController, så bør du føle sig meget komfortable med dette, hvis du allerede har dabbled med UIAlertController

    En kort synopsis (lige fra docs)UITableViewRowAction:

    Beder de delegerede for de handlinger, der skal vises i respons til et stryg i den angivne række. (påkrævet)
    Brug denne metode, når du ønsker at give brugerdefinerede handlinger til en af dine bordet rækker. Når brugeren aflæser vandret i en række, se tabel flytter række indhold til side for at afsløre dine handlinger. At trykke let på et af action-knapper, der udfører den handling blok, som er gemt med den handling, objekt.
    Hvis du ikke gennemfører denne metode, se tabel viser standard tilbehør knapper, når brugeren aflæser rækken.

    Et par bemærkninger, før du begynder :

    • Apple implementeret dette i iOS8 : så overvej nøje, om din installation mål. Hvis du er kodning strengt for i0S8 dette er et hurtigt og let alternativ til 3. parts biblioteker eller oprette en brugerdefineret UITableView redigering stil. Hvis du har til formål at bevare kompatibilitet for iOS7 dine muligheder er begrænsede med dette format. SIDE BEMÆRKNING dette ikke medføre en fatal fejl i din kode, iOS7 apps ikke vil gå ned, men den brugerdefinerede handlinger simpelthen ikke vil vise.
    • Der er ikke meget tilpasning ud over titlen
    • Fordele af dette, er, at alt er behandlet med blokke

    Uanset, at gennemføre en brugerdefineret UITableViewRowAction skal du først sikre din tabel redigeres ved at ringe til følgende metoder:

    - (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
    }

    Minimum, er de to metoder, der skal erklæres, før du går videre.

    Til rent faktisk at tilpasse din række handlingsknapper, følg de generelle retningslinjer, som følger:

    TRIN 1 gennemføre tableView:editActionsForRowAtIndexPath: metode

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

    Som du kan se, er det et eksempel på metode af type NSArray, så du er nødt til at returnere et array.

    TRIN 2 Tilføj handling objekter for at passere i tabellen. Et eksempel:

    {
    
    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];
    }];
    
    }    

    Du kan ændre nogle egenskaber for disse træk handlinger, men se de dokumenter, der fuldstændig tilpasning muligheder:

    Til at tilpasse række tiltag baggrund, farver, bare tag det som de fleste andre handlinger i knapper:

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

    TRIN 3
    Som nævnt før, er du nødt til at returnere et array i et eksempel på metode, så din komplette kode skal ligne følgende :

    -(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...
    }    

    For yderligere reference : LINK TIL DOCUMENTATION


    REDIGERET FOR HURTIG SYNTAKS

    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]
    }
    Tak for dit forslag om redigering af titler. Men i virkeligheden var jeg forsøger at gøre noget ved tilpasning af NSFetchedResultsController at sætte yderligere btns. Dine svar giver en anden løsning for at løse dette problem, men er ikke min oprindelige intension. Igen tak for dit svar.
    Måske du kunne præcisere, så @AlexWei jeg er mere end villig til at redigere mit svar. Grunden til at jeg er forvirret, fordi NSFetchedResultsController blot henter info fra centrale data, der skal vises i UITableView. Action knapper er en del af den UITableView ikke hente controller. Hvis du kunne sende et link eller billede til dit problem, jeg kan bedre forstå for at hjælpe dig
    Det synes jeg er helt forkert. Jeg var ikke klar over “action knapper er en del af den UITableView ikke hente controller”. Jeg troede, de knapper, der hører til den hente controller. 🙁
    Jeg har faste titler. Tak igen for din generøse hjælp!
    det er ok. Vi er alle her for at lære og vokse! Jeg havde bare ikke lyst til at forlade du hængende uden en løsning på dit problem. Det er derfor jeg foreslog dig at redigere titlen, så andre mennesker med samme problem kunne finde en løsning.

    OriginalForfatteren soulshined

  2. 10

    Alle kudos til @soulshined accepteret svar.

    Her er den Hurtige version 3 af det:

    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]
    }
    Tak for konvertering.

    OriginalForfatteren Gunhan

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *