2013-02-25 2 views
1

У меня есть табличный вид, в котором есть большое количество ячеек, используемых для создания формы. Я создал собственный TableViewCell. Эта ячейка содержит метку и текстовое поле, так, например, каждая строка будет выглядеть примерно такiPhone TableView с TextFields - next, предыдущая проблема с кнопкой

enter image description here

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

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

UIBarButtonItem *doneButton = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithTextField:)]; 

     UIBarButtonItem *nextButton = [[UIBarButtonItem alloc]initWithTitle:@"Next" style:UIBarButtonItemStyleDone target:self action:@selector(nextTableTextField:)]; 

     UIBarButtonItem *previousButton = [[UIBarButtonItem alloc]initWithTitle:@"Previous" style:UIBarButtonItemStyleDone target:self action:@selector(previousTableTextField:)]; 


     UIToolbar *numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)]; 
     numberToolbar.barStyle = UIBarStyleBlackTranslucent; 
     numberToolbar.items = [NSArray arrayWithObjects: 
           previousButton, 
           nextButton, 
           [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], 
           doneButton, 
           nil]; 

     [numberToolbar sizeToFit]; 

     field.inputAccessoryView = numberToolbar; 

вопрос я имею, что у меня есть 10 строк таблицы, как это, экран может показывать только около 5 полных строк и немного 6-я строки. Я должен добавить, что я также добавил код для делегатов текстового поля, чтобы, когда текстовое поле становится первым ответчиком, экранные прокрутки позволяют полностью отобразить текстовое поле. Смотрите мой старый пост here для кода.

Итак, при загрузке экрана я нажимаю первую ячейку и щелкаю дальше, отлично работает, перемещается на второе текстовое поле в следующей ячейке. Затем я снова нажимаю следующую кнопку, и она идет в 3-я ячейка, затем 4-го, затем 5-го. Теперь наступает проблема. Когда я нахожусь в 5-й ячейке, и я нажимаю дальше, шестое текстовое поле становится первым ответчиком, но по какой-то причине экран не прокручивается. Теперь большая проблема в том, что когда я нажимаю еще раз, она не перемещается в 7-ое текстовое поле, так как 7-я ячейка еще не записана в памяти, так как она не видна на экране. Поэтому, если я нажму дальше, он ничего не сделает, текстовое поле 6 останется первым ответчиком. Поэтому сначала нужно сначала прокрутить список, так что ячейка 7 будет видна до того, как следующая кнопка будет работать, и сделайте следующее текстовое поле первым ответчиком.

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

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

Заранее спасибо

Edit:

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

ответ

1

Это работает для меня, я использую блоки, которые обжигали при «сделано» кнопка на клавиатуре нажимается для перемещения фокуса в следующий текст выставлял клетку:

FRTextFieldTableViewCell *textFieldCell = [tableView_ dequeueReusableCellWithIdentifier:[FRTextFieldTableViewCell reuseIdentifier]]; 
     if(textFieldCell == nil) { 
      textFieldCell = [[FRTextFieldTableViewCell alloc] initWithStyle: 
          UITableViewCellStyleDefault reuseIdentifier:[FRTextFieldTableViewCell reuseIdentifier]]; 
     } 

     [textFieldCell.textField initialize]; 
     textFieldCell.textField.secureTextEntry = (indexPath.row == 3); 

     __weak FRSignUpViewController *self_ = self; 
     __weak FRTextFieldTableViewCell *textFieldCell_ = textFieldCell; 
     if(indexPath.row == 1) { 
      textFieldCell.textField.placeholder = NSLocalizedString(@"name", @""); 
      textFieldCell.object = self.regUser.name; 
      textFieldCell.didChangedValueAction = ^(NSString *object) { 
       [self_ setName:object]; 
      }; 
      textFieldCell.didEndOnExitAction = ^{ 
       [self_ setName:textFieldCell_.object]; 
       FRTextFieldTableViewCell *nextCell = (FRTextFieldTableViewCell *)[self_.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:0]]; 
       [nextCell.textField becomeFirstResponder]; 
      }; 
     } 
     if(indexPath.row == 2) { 
      textFieldCell.textField.placeholder = NSLocalizedString(@"email", @""); 
      textFieldCell.didChangedValueAction = ^(NSString *object) { 
       [self_ setLoginString:object]; 
      }; 
      textFieldCell.didEndOnExitAction = ^{ 
       [self_ setLoginString:textFieldCell_.object]; 
       FRTextFieldTableViewCell *nextCell = (FRTextFieldTableViewCell *)[self_.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:3 inSection:0]]; 
       [nextCell.textField becomeFirstResponder]; 
      }; 
     } 
     if(indexPath.row == 3) { 
      textFieldCell.textField.placeholder = NSLocalizedString(@"password", @""); 
      textFieldCell.didChangedValueAction = ^(NSString *object) { 
       [self_ setPasswordString:object]; 
      }; 
      textFieldCell.didEndOnExitAction = ^{ 
       [self_ setPasswordString:textFieldCell_.object]; 
       [self_ signUp]; 
      }; 
     } 
     [textFieldCell reloadData]; 
     return textFieldCell; 

BlocksTypedefs:

/* type defenition for blocks, can be used by any app class */ 
typedef void (^CompletionBlock)(id, NSError *); 
typedef void (^SimpleBlock)(void); 
typedef void (^InfoBlock)(id); 
typedef void (^ConfirmationBlock)(BOOL); 

TableViewCell код:

.h файл:

#import "FRTableViewCell.h" 
#import "BlocksTypedefs.h" 
#import "FRTextFieldWithPadding.h" 

@interface FRTextFieldTableViewCell : FRTableViewCell <UITextFieldDelegate> 

@property (nonatomic, copy) SimpleBlock didEndOnExitAction; 
@property (nonatomic, copy) SimpleBlock didEndEditingAction; 
@property (nonatomic, copy) InfoBlock didChangedValueAction; 
@property (nonatomic, strong) IBOutlet FRTextFieldWithPadding *textField; 

@end 

.м:

#import "FRTextFieldTableViewCell.h" 

@implementation FRTextFieldTableViewCell 

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    self.backgroundColor = [UIColor clearColor]; 
} 

- (void)reloadData { 
    self.textField.text = self.object; 
} 

- (IBAction)textFieldValueDidChanged:(UITextField *)sender { 
    self.object = sender.text; 
    if (self.didChangedValueAction) { 
     self.didChangedValueAction(self.object); 
    } 
} 

- (IBAction)textFieldDidEndOnExit:(UITextField *)sender { 
    self.object = sender.text; 
    if (self.didEndOnExitAction) { 
     self.didEndOnExitAction(); 
    } 
} 

#pragma mark - UITextFieldDelegate 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    self.object = textField.text; 
    if (self.didEndEditingAction) { 
     self.didEndEditingAction(); 
    } 
} 

@end 
+0

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

+0

yep, причина, он будет загружен по строке вызова [self_.tableView cellForRowAtIndexPath: [NSIndexPath indexPathForRow: (indexPath.row + 1) inSection: 0]] внутри didEndOnExitHandler – iiFreeman

+0

Не могли бы вы показать мне, как вы добавили функцию блочного кода в свою таблицу поэтому я могу видеть, как вы его реализовали, например, можете ли вы показать мне код, который вы использовали для создания didEndOnExitAction. – AdamM

0
CGRect frame = CGRectMake(0.0, self.view.bounds.size.height, self.view.bounds.size.width, 44.0); 
fieldAccessoryView = [[UIToolbar alloc] initWithFrame:frame]; 
fieldAccessoryView.barStyle = UIBarStyleBlackOpaque; 
fieldAccessoryView.tag = 200; 

[fieldAccessoryView setBarStyle:UIBarStyleBlack]; 

UIBarButtonItem *spaceButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)]; 

UISegmentedControl* segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:NSLocalizedString(@"Previous", @""), NSLocalizedString(@"Next", @""), nil]]; 
[segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged]; 
segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; 
[segmentedControl setMomentary:YES]; 
UIBarButtonItem *segmentButton = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl]; 

[fieldAccessoryView setItems:[NSArray arrayWithObjects:segmentButton, spaceButton, doneButton, nil] animated:NO]; 
[segmentButton release]; 
[spaceButton release]; 
[doneButton release]; 
[segmentedControl release]; 
+0

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

Смежные вопросы