iPhone-storyboard Een tabelweergave bewerken

Ik heb geprobeerd de nieuwe Storyboard-functie in Xcode te leren en ik heb een probleem tegen het proberen om een ​​UITableView-modus voor bewerken te vinden.

Tot dusver ziet mijn storyboard er als volgt uit:

NavigationController -> UIViewController (subclass with tableview property)

Ik heb een item van het item Navigatie en een knop toegevoegd aan de scène van de weergavecontroller, dus ik zie wel een knop Bewerken. Het deed niets automatisch, dus probeerde ik de selector te koppelen aan de methode setEditing van de afgevaardigde voor tableview. Dit bracht het in de bewerkingsmodus. De knop Bewerken is echter niet gewijzigd in een knop 'Gereed' en er is dus geen manier om de bewerkmodus te verlaten.

Moet ik een ander item voor navigatie maken voor de knop Klaar? Hoe sluit ik het aan zodat het op het juiste moment verschijnt en correct werkt?

9

7 antwoord

Ik denk dat ook met Storyboard de enige manier (en zeker de gemakkelijkste) om een ​​werkende bewerk/uitgevoerde knop te implementeren, de volgende code is:

- (void)viewDidLoad
{
[super viewDidLoad];
...
//set the edit button
self.navigationItem.leftBarButtonItem = self.editButtonItem;
...

Dit is de oplossing die Apple zelf implementeert als u een sjabloon "Master-Detail Application" voor uw project selecteert.

Waarschijnlijk is Storyboard nog steeds niet perfect, en hopelijk zal het in volgende releases van Apple worden verbeterd ...

27
toegevoegd

Ik ben net begonnen Storyboards te gebruiken, dus ik wilde ook het Storyboard gebruiken om mijn Edit-knop toe te voegen. Het is vervelend dat je de tijd hebt genomen om te leren hoe je een nieuwe tool kunt gebruiken, maar dat je een rol ducttape nodig hebt om de gaten op te lossen.

Je kunt het laten werken, maar je moet een aangepaste knop toevoegen. Controleer in het inspectorattributen of de ID Custom is en de titel is Edit.

Voeg dan zoiets toe in je .m

- (IBAction)setEditMode:(UIBarButtonItem *)sender {
    if (self.editing) {
        sender.title = @"Edit";
        [super setEditing:NO animated:YES];
    } else {
        sender.title = @"Done";
        [super setEditing:YES animated:YES];
    } 
}

Laat uw Custom Edit-knop de methode setEditMode aanroepen.

Kan alleen maar hopen dat ze de implementatie van de knop Bewerken in de Storyboard-editor in de toekomst zullen repareren.

13
toegevoegd
6 jaar later ... Het is nog steeds niet opgelost.
toegevoegd de auteur gone, de bron

Samenvatten:

De knop, geretourneerd door UIViewController.editButtonItem is een speciale knop omschakelen met een speciaal gedrag dat - (ongeldig) setEditing: (BOOL) aanroept, geanimeerd: (BOOL) geanimeerd indien ingedrukt .

De knop, geretourneerd door UINavigationController.editButtonItem is een eenvoudige knop, net gelabeld met "Bewerken".

Het Storyboard maakt het mogelijk om de laatste te selecteren.

6
toegevoegd

Als u de navigatiecontroller gebruikt om naar de weergaveregelaar te duwen, stelt u eenvoudig self.navigationItem.rightBarButtonItem = self.editButtonItem; in, die de standaardknop Bewerken rechts zal plaatsen. Als de navigatiebalk niet zichtbaar is, belt u self.navigationController.navigationBarHidden = NO; . Die zouden worden aangeroepen in de methode viewDidLoad of iets dergelijks. Gebruik vervolgens de volgende methode om de tabelweergave te krijgen die reageert op de bewerkingsoproep:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    [tableView setEditing:editing animated:animated];
}

Dat zou moeten doen wat je wilt. Als u problemen ondervindt, zegt u dit en kunnen we de details verfijnen

5
toegevoegd
Het zou ongeveer hetzelfde moeten zijn. Ik heb ook de Storyboard UI gebruikt (wat ik moet zeggen maakt het leven een stuk eenvoudiger) en ik heb soortgelijke dingen moeten doen en dat is hoe ik het deed. Ik heb gemerkt dat je af en toe soms door self.parentViewController.navigationItem.rightBarButtonItem = yourButton; moet gaan om de gewenste weergave in je hiërarchie te krijgen. Maar de rest moet hetzelfde blijven als voorheen, zolang uw tableView is gekoppeld aan de viewController als een IBOutlet
toegevoegd de auteur justin, de bron
@SebastianWramba je zou zoiets op een eerlijke manier moeten kunnen doen. Noem het gewoon Bewerken en wijs het een IBAction-methode toe die setEditing: geanimeerd: aanroept. Persoonlijk maak ik het programmatisch aan in de viewDidLoad -methode van de specifieke view-controller, met behulp van self.navigationItem.rightBarButtonItem = self.editButtonItem . Op die manier hoeft u geen methode toe te wijzen ( setEditing ... ) omdat het een standaard knopitem is. Hopelijk is dat logisch
toegevoegd de auteur justin, de bron
Is er nieuws over? Ik heb geprobeerd om erachter te komen hoe ik de ene LOC kan vervangen door de nieuwe Storyboard-functie. Gewoon een knop in de navigatiebalk plaatsen en hem "Bewerken" noemen, werkt natuurlijk niet. ;)
toegevoegd de auteur Sebastian Wramba, de bron
Toegegeven, ik denk dat het opnieuw uitvinden van het wiel (of in dit geval het wiel ergens anders plaatsen) niet echt slim is. Het implementeren van de knop Bewerken op de ouderwetse manier lijkt nog steeds de beste manier, hoewel er nu de storyboards en segues zijn.
toegevoegd de auteur Sebastian Wramba, de bron
Ja, ik weet hoe ik het programmeerbaar moet doen, maar ik heb geprobeerd het te bereiken via de Storyboard-gebruikersinterface.
toegevoegd de auteur markplee, de bron

Als u een antwoord wilt toevoegen aan @Graham, wilt u misschien ook de stijl wijzigen zodat u de knop 'Gereed' kunt gebruiken (de blauwe kleur). Iets zoals dit:

- (IBAction)setEditMode:(UIBarButtonItem *)sender {
    if (self.editing) {
        sender.title = @"Edit";
        sender.style = UIBarButtonItemStylePlain;
        [super setEditing:NO animated:YES];
    } else {
        sender.title = @"Done";
        sender.style = UIBarButtonItemStyleDone;
        [super setEditing:YES animated:YES];
    } 
}
2
toegevoegd

men kan de domme, niet werkende Edit-knop van de storyboard-editor gebruiken en deze vervolgens programmatisch vervangen door de UIViewController.editButtonItem .

in viewDidLoad:

 NSMutableArray *toolbarItems = [NSMutableArray arrayWithArray:self.toolbarItems];

[toolbarItems replaceObjectAtIndex:0 withObject:self.editButtonItem];

[self setToolbarItems:toolbarItems];    

deze code gaat ervan uit dat iemand de domme Edit-knop heeft toegevoegd als het meest linkse item op de werkbalk in het storyboard.

1
toegevoegd
wat is er hacky aan? bedankt
toegevoegd de auteur kitschmaster, de bron
goed, maar ik ben het nog steeds niet eens over de hack term :) wat is een "hack" eigenlijk? voor mij is deze code verre van hack. hack zou zijn, als die code ongeoorloofde toegang zou krijgen tot gegevens in een systeem of een computer, maar het is gewoon de knop Bewerken standaard ...
toegevoegd de auteur kitschmaster, de bron
Dit is een beetje hacky, maar het is beter om de knop Bewerken opnieuw te implementeren.
toegevoegd de auteur SeanR, de bron
Het gebruik van code om de knop die je in Interface Builder hebt toegevoegd te vervangen door de knop die het eigenlijk zou moeten zijn lijkt een beetje een hack ... maar het is een tekortkoming van Apple die ons dwingt het op deze manier te doen. Begrijp me niet verkeerd, ik denk dat dit de beste oplossing is, kort van Apple die de eigenlijke Edit-knop ondersteunt in Interface Builder.
toegevoegd de auteur SeanR, de bron

In het geval dat u UIViewController hebt en hierin hebt u een UITableVIew toegevoegd. Als je een bewerkte UIBarButton wilt toevoegen om te communiceren met UITableView, probeer dan:

Voeg deze regel toe ...

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

    self.navigationItem.leftBarButtonItem = self.editButtonItem;

    ...
}

en deze methode

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {

    [super setEditing:editing animated:animated];
    [self.myListTableView setEditing:editing animated:animated];

    if(self.myListTableView.editing) {
        NSLog(@"editMode on");
    } else {
        NSLog(@"editMode off");
    }
}

waar

@property (weak, nonatomic) IBOutlet UITableView *myListTableView;
1
toegevoegd