#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;
}