Как ограничить ввод символов в UIAlertView UITextField

#ios #objective-c #swift #uialertview

#iOS #цель-c #swift #uialertview #objective-c

Вопрос:

Я пытаюсь ограничить количество символов, которые моему пользователю разрешено вводить в my UITextField в my UIAlertView .

Я попробовал некоторые распространенные ответы в Интернете. Например, как показано ниже :

   #define MAXLENGTH 10


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([textField.text length] > MAXLENGTH) {
        textField.text = [textField.text substringToIndex:MAXLENGTH-1];
        return NO;
    }
    return YES;
}
  

Кто-нибудь может помочь?

Комментарии:

1.К сожалению, я не верю, что это разрешено — ссылка тоже developer.apple.com/library/ios/documentation/uikit/reference /… "The UIAlertView class is intended to be used as-is and does not support subclassing. The view hierarchy for this class is private and must not be modified"

2. Используете ли вы textfielddelegate?

Ответ №1:

.h файл

   @property (strong,nonatomic)  UITextField *alertText;

@interface LocationSearchViewController : UIViewController<UITextFieldDelegate>
  

.m файл

 - (IBAction)butPostalCode:(id)sender {

UIAlertView *alrt=[[UIAlertView alloc]initWithTitle:@"" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
alrt.alertViewStyle = UIAlertViewStylePlainTextInput;
[[alrt textFieldAtIndex:0] setPlaceholder:@"Enter postal Code"];
alertText = [alrt textFieldAtIndex:0];
alertText.keyboardType = UIKeyboardTypeNumberPad;
alertText.delegate=self;
alrt.tag=100;
[alrt show];
}



-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if(yourtextfieldname.text.length >= 10 amp;amp; range.length == 0) {
    return NO;

}
return YES;
}
  

Swift

 class LocationSearchViewController: UIViewController, UITextFieldDelegate {

 Var alertText:UITextField!
}

func butPostalCode(sender: AnyObject) {
var alrt: UIAlertView = UIAlertView(title: "", message: "", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK")
alrt.alertViewStyle = .PlainTextInput
alrt.textFieldAtIndex(0).placeholder = "Enter postal Code"
alertText = alrt.textFieldAtIndex(0)
alertText.keyboardType = .NumberPad
alertText.delegate = self
alrt.tag = 100
alrt.show()
}

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if yourtextfieldname.text.length >= 10 amp;amp; range.length == 0 {
    return false
}
return true
}
  

Ответ №2:

К сожалению, это не разрешено. Вам не разрешается возиться с иерархией UIAlertView s, и поэтому вы не можете изменять в ней такие вещи, как свойства UITextField s.

Пожалуйста, посмотрите эту ссылку

В частности

Класс UIAlertView предназначен для использования как есть и не поддерживает создание подклассов. Иерархия представлений для этого класса является частной и не должна быть изменена

Редактировать

Хотя вам не следует возиться с самой UIAlertView иерархией, как я сказал выше, вы действительно можете установить делегат UITextField s, но сначала вам нужно его получить. Сначала убедитесь, что вы установили значение UITextFieldDelegate в заголовочном файле ( .h файле).

Затем, после того как вы создали свое UIAlertView и установили alertViewStyle: свойство, у нас есть что-то вроде

 // We create an instance of our UIAlertView
UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"My Alert"
                                                  message:nil
                                                 delegate:self
                                        cancelButtonTitle:@"Cancel"
                                        otherButtonTitles:@"OK", nil];

// We set the alertViewStyle to a plain text input, so 1 textfield
[myAlert setAlertViewStyle:UIAlertViewStylePlainTextInput];

// Then we retrieve that UITextField from the index 0 
UITextField *plainTextField = [myAlert textFieldAtIndex:0];
// Now that we have retrieved the text field we can set the delegate on it/
// Probably best to give it a tag as well so we can identify it later.
[plainTextField setDelegate:self]; 
[plainTextField setTag:1001];
  

После того, как мы установили делегат, вы должны ввести свой метод как shouldChangeCharactersInRange: UITextFieldDelegate метод.

 -(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    // Make sure that it is our textField that we are working on otherwise forget the whole thing.
    if([textField tag] == 1001) {
        if([textField text].length >= 10 amp;amp; range.length == 0) {
            return NO;
        }
    }
    return YES;
}
  

Предупреждение

Поскольку извлекаемое текстовое поле textFieldAtIndex: является частью иерархии UIAlertView s, Apple может классифицировать это как изменение UIAlertView , которое запрещено (см. Первую часть ответа), и что бы вы ни делали, не используйте addSubview: при использовании UIAlertView s

Комментарии:

1. @rosshump пожалуйста, имейте в виду, что эта часть документации фактически была изменена с тех пор, как я написал это, хотя она по-прежнему соответствует тому, что я сказал, в ней меньше документации по изменению UIAlertView иерархии, потому что вы UIAlertView устарели.

2. О, хорошо, спасибо, что дали мне знать! Я еще не обновил свои приложения для iOS 8, но обязательно ознакомлюсь с документацией и соответствующим образом обновлю их. Спасибо 🙂

Ответ №3:

Попробуйте с этим:

 #define MAXLENGTH 10

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString *nextValue = [NSString stringWithFormat:@"%@%@", textField.text, string];
    if ([nextValue length] > MAXLENGTH) {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Attention"
                                              message:@"You can't insert more than 10 characters"                          
                                              delegate:nil cancelButtonTitle:nil                          
                                              otherButtonTitles:@"Close", nil];        
        [alert show];            
        return NO;            
    }
    return YES;
}