Делегат для UITextField не работает... Кнопка возврата не отвечает
Я только что начал с xcode и objective-c и сделал некоторые очень простые приложения, но у меня проблема с этим очень просто. кнопка возврата клавиатуры не скрывает клавиатуру.
Я искал интернет для решения, и все, что они говорят, это подключить делегат к владельцу файла и добавить функцию, и она должна работать, я сделал это и ничего не работает.
У меня есть кнопка ok, и она работает, а также нажатие на любое свободное место на экране работает, просто кнопка возврата....
Я использую симулятор, а не тестирование на iphone. (xcode 3.2.5 64 бит с симулятором 4.2).
Это строка кода, которая должна связывать делегат с каждым textFiled.
1. Я уже пробовал возвращать оба YES
и NO
, не работал.
2. Я попробовал как конкретное имя объекта для textField, так и этот общий способ, не работал.
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
В: подключении контроллера основного вида → соединений → выходов, у меня есть: delegate - File Owner. и в владельце файла в реферирующих точках есть: delegate - Round style text.....
EDIT - я забыл упомянуть об этом раньше, у меня есть проверка и метод не вызывается!!!
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSLog(@"Working!!!");
[textField resignFirstResponder];
return YES;
}
что я должен сделать, чтобы это произошло? вот почему люди говорят, чтобы связать делегата, но в моем случае это связано и не вызывает функцию... я знаю, что это своего рода глупый вопрос, но для такого благородного, как я, решение не очевидно...
ОК, другое Edit - со всем моим кодом: просто не могу понять, что делать....
Это: basicViewController.h
:
#import <UIKit/UIKit.h>
@interface basicViewController : <#superclass#> <UITextFieldDelegate>
@interface basicViewController : UIViewController <UITextFieldDelegate> {
//every object that we want to interact with (like text field or lable) is call an outlet!!!!
//here we define the outlets for our program
IBOutlet UITextField *txtName;
IBOutlet UILabel *lblMessage;
}
//here are the getters and setter for our outlets
@property (nonatomic, retain) IBOutlet UITextField *txtName;
@property (nonatomic, retain) IBOutlet UILabel *lblMessage;
//method decleration for the OK button action
- (IBAction) doSomething;
//method for hiding the keyboard when clicking on empty area in the app
//we will put an invisible button on all area and clicking on it will make keyboard disapear
- (IBAction) makeKeyboardGoAway;
@end
Это basicViewController.m
:
#import "basicViewController.h"
@implementation basicViewController
//synthesizeing the objects that we made' this will create the getter and setters automaticly
@synthesize txtName;
@synthesize lblMessage;
- (IBAction) doSomething{
// makeing keyboard disapear when pressing ok button (doing that form the text field)
//when pressing the OK button, the keyboard will disapear and when clicking in the text field it will show again
[txtName resignFirstResponder];
NSString *msg = [[NSString alloc] initWithFormat:@"Hello, %@",txtName.text];
//the objective-c way for setting the test in the text field
[lblMessage setText:msg];
//the regular object oriented way
//lblMessage.text = msg;
[msg release];
}
- (IBAction) makeKeyboardGoAway{
[txtName resignFirstResponder];
}
//when clicking the return button in the keybaord
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSLog(@"Working!!!");
[textField resignFirstResponder];
return YES;
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
Может быть, теперь я более ясен, извините, я этого не делал раньше.
У кого-то есть идея, что я делаю неправильно? он должен быть довольно прочным.....
EDIT - добавление изображения всех элементов, я надеюсь, что это поможет мне: -)
![alt text]()
10x много для каждого, кто пытается помочь.... Мне очень нравится эта фреймворк, это так здорово после С++ и java, python и многих других... и я работаю с книгой, но это для ios 3.1, может быть, это проблема.....
Ответы
Ответ 1
Во-первых, вы должны проверить, действительно ли вызывается textFieldShouldReturn:
, добавив инструкцию NSLog или точку останова в начале метода.
После этого попробуйте вручную объявить, что ваш контроллер просмотра соответствует протоколу <UITextFieldDelegate>
в файле интерфейса:
@interface YourClass : ... <UITextFieldDelegate>
Также объявите свойство и выход для вашего UITextField
, выполните соответствующие соединения в IB и объявите self
в качестве делегата UITextField
с помощью
self.yourUITextFieldObject.delegate = self;
Как только это произойдет, посмотрите, вызывается ли ваш метод выше, и убедитесь, что вы вернули ДА.
Ответ 2
Просто напишите одну строку в
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
}
перед возвратом ДА;
окончательная версия будет следующей:
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
-(void)textFieldDidEndEditing:(UITextField *)textField{
NSLog(@"%@",textField.text);
}
Ответ 3
Вам необходимо назначить делегат текстовых полей владельцу файла. Текстовые поля отправляют сообщение, но не имеют делегата для ответа на него.
Используйте конструктор интерфейса для этого.
Вы должны реализовать этот метод.
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
Ответ 4
Как сказал Рог, не забудьте зарегистрировать текстовое поле для делегата, вы можете сделать это вручную, как он сказал, но в Storyboard вы можете просто управлять перетаскиванием со всех ваших текстовых полей на контроллер вида и зарегистрировать делегат (выберите делегат). Только зарегистрированные текстовые поля могут использовать все эти методы.
Итак, эта строка важна:
self.yourUITextFieldObject.delegate = self;
Или еще проще в эти дни просто использовать раскадровку:
![enter image description here]()
Ответ 5
поместите журнал в
- (IBAction) makeKeyboardGoAway
функция. Я думаю, что этот метод каждый раз, когда что-либо используется на экране. В этом случае вам нужно будет отправить событие касания в текстовое поле. Не уверен, как это делается, но это должно сделать это.
Повторите попытку удаления, которая позаботится о нажатии (щелчок) по всему представлению и попытается сделать то, что вы делаете.
Ответ 6
Скорее всего, проблема в том, что ваш фактический контроллер представления в запущенном приложении не является "basicViewController", а UIViewController, который не реализует протокол UITextFieldDelegate.
Что вы сделали в построителе интерфейса, выбрав свой класс "basicViewController", поскольку FilesOwner просто объявляет объект FilesOwner в вашем запущенном приложении типа basicViewController; фактический объект не, созданный этим объявлением, и в вашем случае это не в xib/nib.
Другая часть вашего кода фактически создает экземпляр объекта контроллера вида и загружает файл xib/nib. В этом месте, я думаю, ваш код создает экземпляр UIViewController (как правило, автоматически сгенерированный код), а не экземпляр вашего элемента управления basicViewController; вам просто нужно изменить класс.
Кроме того, эта ошибка часто возникает при использовании UINavigationController или UITabBarController в построителе интерфейса, который (должен быть) настроен для создания экземпляров и загрузки других пользовательских представлений. Если вы используете такой контроллер более высокого уровня, дважды проверьте, что он фактически настроен на использование вашего базового элемента управления, а не UIViewController при загрузке вашего представления из xib/nib.
Надежда, которая решает проблему!
Ответ 7
Вы можете попробовать это.
@interface ClassName : SuperClass < UITextFieldDelegate >
Ответ 8
Используйте это как...
textfield.delegate=self;
и используйте UITextFieldDelegate
в классе .h
Ответ 9
Вы всегда можете отключить клавиатуру, когда вы даже не знаете, в каком виде находится текстовое поле, используя:
Objective-C:
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder)
to:nil
from:nil
forEvent:nil];
Swift:
UIApplication.sharedApplication().sendAction("resignFirstResponder",
to:nil,
from:nil,
forEvent:nil)
Ответ 10
У меня была та же проблема. У меня есть отдельный класс MyTextFieldDelegate только для моего UITextFieldDelegate, который расширяет UIViewController и UITextFieldDelegate. У меня есть textFieldShouldReturn (...) и некоторые другие функции в нем. В функции ViewDidLoad (...) моего текущего UIViewController (например, MyViewController) я написал:
let myTextfieldDelegateLowLimit = MyTextFieldDelegate()
textfieldLowLimitTo.delegate = myTextfieldDelegateLowLimit
И это не сработало для меня. Но когда я объявил myTextfieldDelegateLowLimit глобально, он сработал.
Ответ 11
Текстовое поле находится в подпункте? в этом случае убедитесь, что текстовое поле имеет делегат FileOwner.