Storyboard pentru iPhone Editarea unei vizualizări de tabel

Am încercat să aflu noua caracteristică Storyboard în Xcode și am întâmpinat o problemă în încercarea de a seta modul UITableView în modul de editare.

Până acum, scenariul meu arată astfel:

NavigationController -> UIViewController (subclass with tableview property)

Am adăugat un element de navigare și un buton Bar la scena controlerului de vedere, așa că văd un buton de editare. Nu a făcut nimic automat, așa că am încercat să leagă selectorul cu metoda setEditing a delegației tableview. Acest lucru a pus-o în modul de editare. Cu toate acestea, butonul de editare nu sa schimbat la un buton "Done" și astfel nu există nici o modalitate de a ieși din modul de editare.

Trebuie să creez un alt element de navigare pentru butonul Terminat? Cum se conectează astfel încât să apară la momentul potrivit și să funcționeze corect?

9

7 răspunsuri

Cred că, de asemenea, cu Storyboard, singura modalitate (cu siguranță, cea mai ușoară) de a implementa un buton editați/terminat este să utilizați următorul cod:

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

Aceasta este soluția pe care Apple o implementează dacă selectați un șablon "Master-Detail Application" pentru proiectul dvs.

Probabil Storyboard nu este încă perfect, și sperăm că va fi îmbunătățit de la Apple în următoarele versiuni ...

27
adăugat

Tocmai am inceput sa folosesc Storyboards, asa ca am vrut sa folosesc si Storyboard pentru a adauga butonul Edit. Este enervant să vă fi dat timpul să învățați cum să utilizați un nou instrument, dar să găsiți că aveți nevoie de o bandă de bandă pentru a fixa găurile.

Poți să o duci la lucru, dar trebuie să adaugi un buton personalizat. În inspectorul Atribute, asigurați-vă că identificatorul este personalizat și că titlul este Editare.

Apoi adăugați ceva de genul ăsta în .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];
    } 
}

Alegeți butonul personalizat de editare apelați metoda setEditMode.

Sperăm că vor repara în viitor implementarea butonului Edit în editorul Storyboard.

13
adăugat
6 ani mai târziu ... Încă nu a fost rezolvată.
adăugat autor gone, sursa

A rezuma:

Butonul returnat de UIViewController.editButtonItem este un buton de comutare specială cu comportament special care solicită - (void) setEditing: (BOOL) editat animat: (BOOL) animat .

Butonul, returnat de UINavigationController.editButtonItem este un buton simplu, etichetat cu "Edit".

Tabloul de bord permite selectarea acestuia din urmă.

6
adăugat

Dacă utilizați controlerul de navigație pentru a împinge la controlerul de vizualizare, setați pur și simplu self.navigationItem.rightBarButtonItem = self.editButtonItem; , care va pune butonul Editare implicit în dreapta. Dacă bara de navigare nu este vizibilă, sunați la self.navigationController.navigationBarHidden = NO; . Acestea ar fi numite în metoda viewDidLoad , sau ceva similar. Apoi, pentru ca tableview să răspundă la apelul de editare, utilizați următoarea metodă:

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

Ar trebui să facă ceea ce vrei să facă. Dacă aveți vreo problemă, spuneți-o și puteți restrânge detaliile

5
adăugat
Ar trebui să fie aproape același lucru. Am folosit și UI Storyboard (pe care trebuie să spun că face viața mult mai ușoară) și a trebuit să facă lucruri similare și așa am făcut-o. Am observat că uneori trebuie să treci uneori prin self.parentViewController.navigationItem.rightBarButtonItem = butonul dvs. pentru a obține viziunea dorită în heirarhia ta. Dar restul ar trebui să rămână la fel ca înainte, atât timp cât tableview este legat de ViewController ca un IBOutlet
adăugat autor justin, sursa
@SebastianWramba ar trebui să poți face ceva de genul ăsta, sincer. Doar apelați-l Editați, apoi aloca o metodă IBAction care solicită setEditing: animated: . Personal, l-am creat programabil în metoda viewDidLoad a controlerului specific, folosind self.navigationItem.rightBarButtonItem = self.editButtonItem . În acest fel nu trebuie să atribuiți o metodă ( setEditing ... ) deoarece este un element de buton standard. Sperăm că acest lucru are sens
adăugat autor justin, sursa
Există vreo știre despre asta? Încerca să-ți dai seama cum să înlocuiți un LOC cu noua caracteristică Storyboard. Doar punerea unui buton în bara de navigare și numirea lui "Edit" nu funcționează desigur. ;)
adăugat autor Sebastian Wramba, sursa
Adevărat, presupun că reinventarea roții (sau, în acest caz, a pune roata în altă parte) nu este o mișcare foarte inteligentă. Punerea în aplicare a butonului Edit modul de modă veche pare să fie cel mai bun mod, deși există acum storyboards și segues.
adăugat autor Sebastian Wramba, sursa
Da, știu cum să o fac programatic, dar am încercat să o realizez prin interfața Storyboard.
adăugat autor markplee, sursa

Pentru a adăuga la răspunsul @Graham, este posibil să doriți și să schimbați stilul, astfel încât să aveți stilul butonului "Done" (culoarea albastră). Ceva de genul:

- (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
adăugat

se poate folosi butonul Edit, nu funcționează din editorul Storyboard și apoi se înlocuiește programabil cu UIViewController.editButtonItem .

în vedereDidLoad:

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

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

[self setToolbarItems:toolbarItems];    

acest cod presupune că unul dintre ele a adăugat butonul Modul mut ca cel mai din stânga element din bara de instrumente din Storyboard.

1
adăugat
ce-i cam nebun? Mulțumiri
adăugat autor kitschmaster, sursa
dar tot nu sunt de acord cu termenul de hack :) ce este un "hack" oricum? pentru mine acest cod este departe de hack. hack ar fi, în cazul în care acest cod ar obține acces neautorizat la date într-un sistem sau computer, dar este doar regulate Butonul de modificare boilerplate ...
adăugat autor kitschmaster, sursa
Acesta este un pic cam nebun, dar este preferabil să re-implementați butonul de editare.
adăugat autor SeanR, sursa
Folosind codul pentru a înlocui butonul pe care l-ai adăugat în Interface Builder cu butonul ar trebui să fie într-adevăr un pic de hack ... dar este un neajuns din partea Apple care ne obligă să o facem în acest fel. Nu mă înțelegeți greșit, cred că aceasta este soluția cea mai bună de la Apple, care suportă butonul Editare reală din Interface Builder.
adăugat autor SeanR, sursa

În cazul în care aveți UIViewController și în interiorul acestuia ați adăugat un UITableVIew. Dacă doriți să adăugați o editare UIBarButton pentru a interacționa cu UITableView, încercați:

Adăugați această linie ...

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

    self.navigationItem.leftBarButtonItem = self.editButtonItem;

    ...
}

și această metodă

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

Unde

@property (weak, nonatomic) IBOutlet UITableView *myListTableView;
1
adăugat
iOS dezvoltatori, România — Moldova
iOS dezvoltatori, România — Moldova
18 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro, @seo_ro Android: @ro_android