Добавление метода в мой uitextfield в ячейке?
Я добавляю этот метод мой код для форматирования текстового поля. Я использую код ниже, чтобы попытаться добавить метод, но он не работает, что я делаю неправильно?
.файл H
NSString* phone_;
UITextField* phoneFieldTextField;
@property (nonatomic,copy) NSString* phone;
.файл м
@synthesize phone = phone_;
ViewDidLoad{
self.phone = @"";
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
// Make cell unselectable and set font.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.font = [UIFont fontWithName:@"ArialMT" size:13];
if (indexPath.section == 0) {
UITextField* tf = nil;
switch ( indexPath.row ) {
case 3: {
cell.textLabel.text = @"Phone" ;
tf = phoneFieldTextField = [self makeTextField:self.phone placeholder:@"xxx-xxx-xxxx"];
phoneFieldTextField.keyboardType = UIKeyboardTypePhonePad;
[self formatPhoneNumber:phoneFieldTextField.text deleteLastChar:YES];
[cell addSubview:phoneFieldTextField];
break ;
}
// Textfield dimensions
tf.frame = CGRectMake(120, 12, 170, 30);
// Workaround to dismiss keyboard when Done/Return is tapped
[tf addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];
}
}
// Textfield value changed, store the new value.
- (void)textFieldDidEndEditing:(UITextField *)textField {
//Section 1.
if ( textField == nameFieldTextField ) {
self.name = textField.text ;
} else if ( textField == addressFieldTextField ) {
self.address = textField.text ;
} else if ( textField == emailFieldTextField ) {
self.email = textField.text ;
} else if ( textField == phoneFieldTextField ) {
self.phone = textField.text ;
}else if ( textField == dateOfBirthTextField ) {
self.dateOfBirth = textField.text ;
}
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString* totalString = [NSString stringWithFormat:@"%@%@",textField.text,string];
// if it's the phone number textfield format it.
if(textField.tag == 10 ) {
if (range.length == 1) {
// Delete button was hit.. so tell the method to delete the last char.
textField.text = [self formatPhoneNumber:totalString deleteLastChar:YES];
} else {
textField.text = [self formatPhoneNumber:totalString deleteLastChar:NO ];
}
return false;
}
return YES;
NSLog(@"Testing should change character in range");
}
-(NSString*) formatPhoneNumber:(NSString*) simpleNumber deleteLastChar:(BOOL)deleteLastChar {
if(simpleNumber.length == 0) return @"";
// use regex to remove non-digits(including spaces) so we are left with just the numbers
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[s-()]" options:NSRegularExpressionCaseInsensitive error:&error];
simpleNumber = [regex stringByReplacingMatchesInString:simpleNumber options:0 range:NSMakeRange(0, [simpleNumber length]) withTemplate:@""];
// check if the number is to long
if(simpleNumber.length>10) {
// remove last extra chars.
simpleNumber = [simpleNumber substringToIndex:10];
}
if(deleteLastChar) {
// should we delete the last digit?
simpleNumber = [simpleNumber substringToIndex:[simpleNumber length] - 1];
}
// 123 456 7890
// format the number.. if it's less then 7 digits.. then use this regex.
if(simpleNumber.length<7)
simpleNumber = [simpleNumber stringByReplacingOccurrencesOfString:@"(d{3})(d+)"
withString:@"() "
options:NSRegularExpressionSearch
range:NSMakeRange(0, [simpleNumber length])];
else // else do this one..
simpleNumber = [simpleNumber stringByReplacingOccurrencesOfString:@"(d{3})(d{3})(d+)"
withString:@"() -"
options:NSRegularExpressionSearch
range:NSMakeRange(0, [simpleNumber length])];
if (simpleNumber.length == 10 && deleteLastChar == NO) { [self resignFirstResponder];}
return simpleNumber;
NSLog(@"Testing format phone number");
}
#pragma mark - TextField
-(UITextField*) makeTextField: (NSString*)text
placeholder: (NSString*)placeholder {
UITextField *tf = [[UITextField alloc] init];
tf.placeholder = placeholder;
tf.text = text ;
tf.autocorrectionType = UITextAutocorrectionTypeNo ;
tf.autocapitalizationType = UITextAutocapitalizationTypeNone;
tf.adjustsFontSizeToFitWidth = YES;
tf.returnKeyType = UIReturnKeyDone;
tf.textColor = [UIColor colorWithRed:56.0f/255.0f green:84.0f/255.0f blue:135.0f/255.0f alpha:1.0f];
return tf ;
}
4 ответов
метод, который вы используете:
-(NSString*) formatPhoneNumber:(NSString*) simpleNumber deleteLastChar:(BOOL)deleteLastChar
возвращает объект NSString. В вашем случае вы вызываете метод правильно, но вы не устанавливаете возвращаемый объект NSString ни на что. Она просто висит там. Вам нужно установить phoneFieldTextField в форматированный текст следующим образом:
phoneFieldTextField.text = [self formatPhoneNumber:phoneFieldTextField.text deleteLastChar:YES];
Примечание-Если вы хотите узнать больше о методах возврата, прочитайте следующее:
если вы заметили, что некоторые большинство методов пустота тип. Вы знаете это, когда видите такой метод:
- (void)someMethod {
int x = 10;
}
- (int)returnSomething {
int x = 10;
return x;
}
Первое, что вы заметите, это тип возврата больше не является пустым, это int. Это означает, что метод возвращает тип integer. В этом случае код выполняется, и вы возвращает значение x.
это только начало темы методы возвращения, но, надеюсь, это делает вещи немного яснее для вас.
во-первых, вы должны сказать нам что не работает у нас нет вашего приложения и всего вашего кода. Вам нужно объяснить, что работает, а что нет. Потребовалось больше времени, чтобы понять, что ваш вопрос-почему это textField:shouldChangeCharactersInRange:
не работает. Вы установили точку останова в функции, чтобы увидеть, что она делает. Разве это не называется?
это сказало, что ваша ошибка-это textField:shouldChangeCharactersInRange:
использует теги для идентификации текстовых полей, но остальная часть кода использует указатели
// if it's the phone number textfield format it.
- if(textField.tag == 10 ) {
+ if(textField.tag == phoneFieldTextField ) {
также вы не включили код makeTextField:placeholder:
в нем тоже могут быть проблемы. Сравните свой код с makeTextField:placeholder:
в моем примере.
Я создал пример проекта на GitHub. Исправить это. Я также демонстрирую лучший подход к созданию входных форм с использованием табличных представлений.
https://github.com/GayleDDS/TestTableViewTextField.git
смотреть на обоих диффов, чтобы увидеть, что я сделал, чтобы YourTableViewController.m
чтобы сделать вещи работа.
https://github.com/GayleDDS/TestTableViewTextField/commit/d65a288cb4da7e1e5b05790ea23d72d472564793 https://github.com/GayleDDS/TestTableViewTextField/commit/31ecaec8c9c01204643d72d6c3ca5a4c58982099
здесь есть куча других вопросов:
- вам нужно вызвать [super viewDidLoad]; в вашем методе viewDidLoad
- нужно правильно отступ ваш код (может быть вырезать и вставить выпуск)
- вы должны использовать раскадровку для создания своих представлений. См. вкладку лучшее решение и реализацию BetterTableViewController.
должны смотреть-iOS видео разработки
WWDC 2011-сессия 309-введение в построитель интерфейса Storyboarding
https://developer.apple.com/videos/wwdc/2011/?id=309-
Стэнфорд iPhone класс программирования (зима 2013)
Кодирование вместе: разработка приложений для iPhone и iPad
https://itunes.apple.com/us/course/coding-together-developing/id593208016- лекция 9. Вид прокрутки и вид таблицы
- лекция 16. Сегменты и текстовые поля
похоже, вы не делегат <UITextFieldDelegate>
в рамках .H файл, а не назначение свойства делегата textfield self tf.delegate = self;
для вызова - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
попробуйте это и дайте мне знать, как она идет
-Удачи!
@koray был прав: вам нужно настроить делегат для класса. Ваш класс должен быть объявлен как реализующий протокол UITextFieldDelegate (в дополнение к UITableViewDataSource, я полагаю)
затем в вашем makeTextField: (NSString*)text placeholder: (NSString*)placeholder метод, вы должны иметь что-то вроде:
-(UITextField*) makeTextField: (NSString*)text
placeholder: (NSString*)placeholder {
UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(40, 0, 150, 40)];
tf.placeholder = placeholder;
// (...)
tf.delegate = self;
return tf ;
}
тогда вам нужно правильно настроить методы делегата. В следующем примере у меня есть панель навигации, так как панель чисел не есть кнопка возврата или готово. Я настраиваю кнопку, которая будет действовать как кнопка done (у вас может быть другой способ заставить клавиатуру идти, и переключение между текстовыми полями вызовет конец издания в любом случае):
- (void) textFieldDidBeginEditing:(UITextField *)textField {
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneEditing:)];
self.navBar.topItem.rightBarButtonItem = doneBtn;
}
- (void) doneEditing:(id) sender {
if(phoneFieldTextField.isFirstResponder) {
[phoneFieldTextField resignFirstResponder];
}
// (...)
self.navBar.topItem.rightBarButtonItem = nil;
}
затем магия происходит в методе делегата textDidEndEditing:
- (void)textFieldDidEndEditing:(UITextField *)textField {
if ( textField == phoneFieldTextField ) {
self.phone = [self formatPhoneNumber:textField.text deleteLastChar:YES] ; // convert
[phoneFieldTextField setText:self.phone]; // display
}
// (...)
}