Делегат для UITextField не работает ... Кнопка возврата не отвечает - PullRequest
13 голосов
/ 14 декабря 2010

Я только начал с xcode и target-c и сделал несколько очень простых приложений, но с чем я столкнулся, так это очень просто. кнопка возврата клавиатуры не скрывает клавиатуру.

Я искал в Интернете решение, и все, что они говорят, это подключить делегата к владельцу файла и добавить функцию, и она должна работать, я сделал это, и ничего не работает.

У меня есть кнопка ОК, и она работает, а также работает нажатие на любое свободное место на экране, только кнопка возврата ....

Я использую симулятор, пока не тестирую на iphone. (xcode 3.2.5 64 бит с симулятором 4.2).

Это строка кода, которая должна соединить делегат с каждым textFiled. 1. Я уже пытался вернуть и YES, и NO, не сработало. 2. Я попробовал как конкретное имя объекта для textField, так и этот общий способ, не сработало.

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}

В: подключение контроллера основного вида -> подключения -> розетки, у меня есть: делегат - владелец файла. а в владельце файла в ссылочных точках есть: делегат - текст круглого стиля .....

РЕДАКТИРОВАТЬ - я забыл упомянуть ранее, я проверил, и метод не вызывается !!!

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSLog(@"Working!!!");
[textField resignFirstResponder];
return YES;

} * * тысяча двадцать-один

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

ОК, еще одно редактирование - со всем моим кодом: просто не могу понять, что делать .... Это: 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

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

РЕДАКТИРОВАТЬ - Добавление изображения всех элементов, я надеюсь, что это поможет мне: -) alt text

10х много для каждого, кто пытается помочь .... мне очень нравится этот фреймворк, он так хорош после c ++ и java, python и многих других ... и я работаю с книгой, но это для ios 3.1, может в этом проблема .....

Ответы [ 10 ]

31 голосов
/ 14 декабря 2010

Во-первых, вы должны проверить, действительно ли вызывается textFieldShouldReturn:, добавив оператор NSLog или точку останова в начале метода.

Когда это не так, попробуйте вручную объявить, что ваш контроллер представления соответствует протоколу <UITextFieldDelegate> в файле интерфейса:

@interface YourClass : ... <UITextFieldDelegate>

Также объявите свойство и розетку для вашего UITextField, установите соответствующие соединения в IB и вручную объявите self как делегат UITextField с:

self.yourUITextFieldObject.delegate = self;

Как только это будет сделано, посмотрите, вызывается ли ваш метод выше, и убедитесь, что вы возвращаете YES.

6 голосов
/ 24 февраля 2012

Просто напишите одну строку в

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
}

до возврата ДА; окончательная версия будет такой, как указано ниже:

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    return YES;
}

-(void)textFieldDidEndEditing:(UITextField *)textField{

    NSLog(@"%@",textField.text);
}
3 голосов
/ 14 марта 2012

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

Используйте для этого конструктор интерфейса.Вы должны реализовать этот метод ..

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
  [textField resignFirstResponder];
  return YES;
}
2 голосов
/ 23 мая 2013

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

Так что эта строка важна:

self.yourUITextFieldObject.delegate = self;

Или еще проще в наши дни просто использовать раскадровку:

enter image description here

1 голос
/ 10 октября 2017

текстовое поле в подпредставлении? в этом случае убедитесь, что в текстовом поле есть делегат FileOwner.

1 голос
/ 06 января 2011

Скорее всего, проблема заключается в том, что ваш действительный контроллер представления в работающем приложении - это не "basicViewController", а UIViewController, который не реализует протокол UITextFieldDelegate.

То, что вы сделали в конструкторе интерфейсов, выбрав класс «basicViewController» в качестве FilesOwner, просто объявляет объект FilesOwner в вашем запущенном приложении как тип basicViewController; фактический объект не создается этим объявлением, а в вашем случае его нет в xib / nib.

Какая-то другая часть вашего кода на самом деле создает объект контроллера представления и загружает файл xib / nib. В этом месте, я полагаю, ваш код создает экземпляр UIViewController (обычно с помощью автоматически сгенерированного кода), а не является экземпляром вашего basicViewController; Вы просто должны изменить класс там.

Кроме того, эта ошибка часто возникает при использовании UINavigationController или UITabBarController в Интерфейсном Разработчике, который (должен быть) настроен для создания экземпляров и загрузки других пользовательских представлений. Если вы используете такой контроллер более высокого уровня, перепроверьте, что он действительно настроен на использование вашего basicViewController, а не UIViewController, при загрузке вашего представления из xib / nib.

Надеюсь, это решит проблему!

1 голос
/ 15 декабря 2010

поставить бревно на

- (IBAction) makeKeyboardGoAway

функция. Я думаю, что этот метод каждый раз, когда что-то нажимается на экране. В этом случае вам нужно будет отправить сенсорное событие в текстовое поле. Не уверен, как это сделать, но это должно сделать это. В противном случае попробуйте удалить тот, который заботится о касании (щелчке) по всему виду и попытаться сделать то, что вы делаете.

0 голосов
/ 14 января 2016

Вы всегда можете отключить клавиатуру, даже не зная, в каком представлении находится текстовое поле, используя:

Objective-C:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) 
                                           to:nil 
                                         from:nil 
                                     forEvent:nil];

Swift:

UIApplication.sharedApplication().sendAction("resignFirstResponder", 
                                           to:nil, 
                                         from:nil, 
                                     forEvent:nil)
0 голосов
/ 02 апреля 2013

Используйте вот так ...

textfield.delegate=self;

и используйте UITextFieldDelegate в .h классе

0 голосов
/ 14 декабря 2010

Можете ли вы попробовать это ..

@interface ClassName : SuperClass < UITextFieldDelegate >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...