Делегат для 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.