включить / отключить режим редактирования в UITableViewCell - PullRequest
2 голосов
/ 11 марта 2012

У меня есть пользовательский UITableViewCell, в котором есть 1 текстовое поле и метка. Я хотел бы включить редактирование текстового поля, только когда просмотр таблицы находится в режиме редактирования.

Я использую следующие методы для включения режима редактирования текстового поля и отключения режима редактирования текстового поля. но это не работает. Я не уверен, правильный ли это подход или нет. Если это не правильный путь, дайте мне знать, как отключить включение текстового поля?

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSIndexPath *rowToSelect = indexPath;
    EditingTableViewCell *detSelCell;
    detSelCell = (EditingTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
    detSelCell.textField.enabled = self.editing;

    // Only allow selection if editing.
    if (self.editing) 
    {
        return indexPath;
    }
    else 
    {
        return nil;
    } 
}

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

        if (!self.editing) 
        {
            return;
        }
        EditingTableViewCell *detcell;
        detcell = (EditingTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
            detcell.selectionStyle = style;
            detcell.textField.enabled = self.editing;

также у меня есть следующие строки:

self.tableView.allowsSelection = NO; // Keeps cells from being selectable while not editing. No more blue flash.
self.tableView.allowsSelectionDuringEditing = YES; // Allows cells to be selectable during edit mode.

Пожалуйста, помогите!

Ответы [ 3 ]

3 голосов
/ 11 марта 2012

--- Я нашел ответ:

Я удалил код включения / выключения из следующих методов:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

и добавил следующее в custom cell.m

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.1];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationBeginsFromCurrentState:YES];

    if(editing){
        textField.enabled = YES;
    }else{
       textField.enabled = NO;
    }

    [UIView commitAnimations];
}

сейчас работает. я не уверен, что это правильный подход или нет, но он работает нормально.

0 голосов
/ 14 октября 2013

Поскольку я искал то же самое в течение некоторого времени, вот полный код для его достижения

TextFieldTableViewCell.h

@interface TextFieldTableViewCell : UITableViewCell <UITextFieldDelegate> {
        UITextField *textField;
    }

    @property (nonatomic, strong) UITextField *textField;
    // add delegate/protocol to inform of change

@end

TextFieldTableViewCell.m

#import "TextFieldTableViewCell.h"

@implementation TextFieldTableViewCell

@synthesize textField;

- (void)initializeTextField {
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    self.textField = [[UITextField alloc] initWithFrame:CGRectZero];
    self.textField.autocorrectionType = UITextAutocorrectionTypeDefault;
    self.textField.enabled = NO; // not editable unless the table is in edit mode
    // do all the necessary textfield setup here, font/alignment and so on

    [self addSubview:self.textField];

    self.accessoryType = UITableViewCellAccessoryNone;
}

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

// from storyboard
- (id)initWithCoder:(NSCoder *)aDecoder {

    if( (self = [super initWithCoder:aDecoder])) {
        [self initializeTextField];
    }
    return self;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [self.textField resignFirstResponder];
    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    // Extra code to be added here to notify a delegate that text has changed since cell is holding the value temporarily 
    // ..... 
    UITableView *tableView = (UITableView *)self.superview;
    [tableView deselectRowAtIndexPath:[tableView indexPathForCell:self] animated:YES];
}

- (void)layoutSubviews {
    [super layoutSubviews];
    CGRect editFrame = CGRectInset(self.contentView.frame, 10, 10);

    if (self.textLabel.text && [self.textLabel.text length] != 0) {
        CGSize textSize = [self.textLabel sizeThatFits:CGSizeZero];
        editFrame.origin.x += textSize.width + 10;
        editFrame.size.width -= textSize.width + 10;
        self.textField.textAlignment = UITextAlignmentRight;
    } else {
        self.textField.textAlignment = UITextAlignmentLeft;
    }

    self.textField.frame = editFrame;
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    self.textField.enabled = editing;
}

- (void)setSelected:(BOOL)selected {
    [super setSelected:selected];
    if (selected) {
        [self.textField becomeFirstResponder];
    }
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    if (selected) {
        [self.textField becomeFirstResponder];
    }
}

@end

И с настройкой в ​​табличном представлении вы ожидаете, что строка будет отображаться в обычном режиме и редактироваться в режиме редактирования

self.tableView.allowsSelection = NO;
self.tableView.allowsSelectionDuringEditing = YES;
0 голосов
/ 11 марта 2012

РЕДАКТИРОВАТЬ: мой плохой, не правильно прочитал подписи метода. То, что вы спрашиваете, довольно сложно сделать, потому что все текстовые поля, скорее всего, являются подпредставлениями ячейки или ее contentView. Что вам нужно сделать, это отключить ячейку selectionStyle, вернуть nil для всего в willSelect ... Затем разрешить выбор во время редактирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...