2012-12-02 11 views
8

To robi moją głowę :-)Niestandardowe UITableViewCell w trybie edycji nie porusza moje UILabels

mam w pełni funkcjonalny CoreData Zaludnionych UITableView wewnątrz UIViewController a ja z powodzeniem wdrożył „przesunąć usunąć opcję” (co jest łatwe) i mogę również usuwać pojedyncze instancje za pomocą przycisku edycji, w którym pojawia się czerwone kółko.

Moim problemem jest i myślę, że to dlatego, że mam CustomCell, że po naciśnięciu przycisku edycji UILabels nie przesuwa się w prawo.

Próbowałem używać -(void)layoutSubViews i kilku innych, ale nic nie działa.

Napisałem swój kod do mojego cellForRowAtIndexPath. Jest to część sekcji notatek w mojej aplikacji. Ten kod działa, po prostu muszę wiedzieć Jak przenieść etykiety, kiedy wchodzę w tryb edycji?

Dziękuję za wskazówki i porady :-)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *cellIdentifier = @"Cell"; 

MNCustomCell *cell = [_mainTableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 
if (cell == nil) { 
    cell = [[MNCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
} 


//cell.textLabel.text = [_tableArray objectAtIndex:indexPath.row]; 

MNotes *mnotes = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 

cell.noteTitle.text = mnotes.noteTitleString; 
cell.noteSummary.text = mnotes.mainNoteString; 

mnotes.createDate = [[NSDate alloc] init]; 
SORelativeDateTransformer *relativeDateTransformer = [[SORelativeDateTransformer alloc] init]; 
NSString *relativeDate = [relativeDateTransformer transformedValue:mnotes.createDate]; 

cell.noteDate.text = relativeDate; 


cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

return cell; 
} 

-

//This is the Custom Cell 
@interface MNCustomCell : UITableViewCell 
{ 

} 

@property (strong, nonatomic) IBOutlet UILabel *noteTitle; 
@property (strong, nonatomic) IBOutlet UILabel *noteDate; 

@property (strong, nonatomic) IBOutlet UITextView *noteSummary; 


@end 

-

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
    { 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
    // Initialization code 

    [self.contentView addSubview:_noteTitle]; 
    [self.contentView addSubview:_noteSummary]; 
    [self.contentView addSubview:_noteDate]; 

    } 
    return self; 
    } 
+0

Czy etykiety dodawane bezpośrednio do komórki czy też dodać je do komórki 'contentView'? Powinny one znajdować się w 'contentView', aby automatycznie dostosowywały się, gdy komórka przechodzi do trybu edycji lub dodawane są inne dekoracje komórek. – rmaddy

+0

Stworzyłem nową klasę niestandardową i przeciągnąłem je do tego z Storyboard - myślę, że to oznacza, że ​​są bezpośrednio na komórce, prawda? –

+0

Dodałem kod dla mojej komórki niestandardowej - Nie dodałem nic w pliku .m - nie musiałem się do tej pory. –

Odpowiedz

8

Innym rozwiązaniem będzie prawdopodobnie działać, ale w ten sposób będzie zrobić animację automatycznie. MNCustomCell nie zmieni układu widoku w zależności od bieżącego stanu komórki, ale jeśli dodasz swoją etykietę do contentView komórki, będzie.

Następujący przykład spowoduje przeniesienie etykiety, aby nie kolidowała z przyciskiem usuwania.

MNCustomCell.m

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 220.0, 15.0)]]; 
     mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview:mainLabel]; 
+0

Dodałem kod, który powiedziałeś na górze (trzecia partia kodu), czy to właściwe miejsce? Nadal nie działa. Ale w TableView nadal ustawiam textlabels tak jak mam rację? –

+0

Trzecia partia kodu? Nie jestem pewny co masz na myśli. – Fredrik

+0

Przepraszamy, jeśli spojrzysz na oryginalne pytanie, podzielę zgłoszony kod w 3 segmentach. trzecia to ta, o której mówię. jest na samym dole pytania. –

1

Wdrożenie następujących metod w swojej klasie niestandardowy komórki.

- (void)willTransitionToState:(UITableViewCellStateMask)state 

i

- (void)didTransitionToState:(UITableViewCellStateMask)state 

i przenieść etykietę odpowiednio.

To powinno być jak

- (void)willTransitionToState:(UITableViewCellStateMask)state { 

    [super willTransitionToState:state]; 

    if ((state & UITableViewCellStateShowingDeleteConfirmationMask) == UITableViewCellStateShowingDeleteConfirmationMask) { 
     label.frame = ... 
    } 
} 

EDIT:

- (void)willTransitionToState:(UITableViewCellStateMask)state { 

    [super willTransitionToState:state]; 

// label.hidden = YES; 
// label.alpha = 0.0; 
} 

- (void)didTransitionToState:(UITableViewCellStateMask)state { 

    [super didTransitionToState:state]; 

    if (state == UITableViewCellStateShowingDeleteConfirmationMask) { 

     [UIView beginAnimations:@"anim" context:nil]; 
     label.frame = leftFrame; 
     [UIView commitAnimations]; 
    } else if (state == UITableViewCellStateDefaultMask) { 

     [UIView beginAnimations:@"anim" context:nil]; 
     label.frame = rightFrame; 
     [UIView commitAnimations]; 
    } 
} 
+0

Musisz po prostu zmienić położenie klatek w obu metodach. W metodzie 'will..' musisz przesunąć etykietę w prawo, aw metodzie' did..' musisz przesunąć etykietę w lewo. – Ilanchezhian

+0

ok - Mam to działa, jednak etykieta nie animuje się z nim, to tylko klika na nową pozycję. Próbowałem [UIView beginAnimations: nil context: NULL]; ale jest duże opóźnienie, aby wyglądało naturalnie. –

+0

Zobacz moją zmienioną odpowiedź – Ilanchezhian

Powiązane problemy