Ошибка, когда ViewController реализует UITextFieldDelegate - PullRequest
0 голосов
/ 25 июня 2011

При реализации UITextFieldDelegate в моем классе ViewController возникает следующая ошибка при вводе первого символа в текстовое поле:

-[MyViewController respondsToSelector:]: message sent to deallocated instance...

Итак, я попытался создать отдельный класс (наследующий только NSObject) и реализовать UITextFieldDelegate. Угадайте что, это сработало отлично. Тем не менее, это создает некоторые другие проблемы, так как мне приходится делать много отвратительного общения между классами, которого я хотел бы избежать. Вот соответствующие части моего кода делегата приложения:

@interface RMSAppDelegate : NSObject <UIApplicationDelegate,
                                      UITabBarControllerDelegate>

@property (nonatomic, retain) UIViewController* myViewController;

@end

@implementation MyAppDelegate

@synthesize myViewController;

- (BOOL)application:(UIApplication *)application
            didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    myViewController = [[MyViewController alloc]
                         initWithNibName:@"MyView" bundle:nil];
    [self.window setRootViewController:myViewController];
    [self.window makeKeyAndVisible];
    return YES;
}

@end

.. и вот что отображается:

@interface MyViewController : UIViewController <UITextFieldDelegate>

@property (nonatomic, retain) IBOutlet UITextField* pinTextField;
- (void)viewDidLoad;

@end

@implementation MyViewController

@synthesize pinTextField;

- (void)viewDidLoad {
    // DOES NOT WORK (WHY?)
    //[pinTextField setDelegate:self];

    // WORKS, BUT I'D LIKE TO AVOID
    [pinTextField setDelegate:[[[MyTextFieldDelegate alloc] init] autorelease];

    [pinTextField becomeFirstResponder];
    [super viewDidLoad];
}

@end

И, пожалуйста, если вы видите какой-либо код (даже не по теме), который я мог бы сделать лучше, оставьте комментарий.

Ответы [ 2 ]

0 голосов
/ 26 июня 2011

Хорошо, я наконец решил это самостоятельно.Я не изменил код.Мой NIB (.xib) был виновником!

Я думал, что вложенные UIViewControllers были в порядке, и я все еще думаю, что они в некоторых случаях (и, возможно, используют другой программный метод).Во всяком случае, я инициализировал свой класс MyViewController с помощью NIB, который на панели «Объекты» имел UIViewController в качестве первого объекта.

Я решил эту проблему, установив UIView в качестве первого объекта на панели «Объекты», и установиввместо этого владельцем файла будет UIViewController.

Правильный код, неправильный NIB.Спасибо за вашу помощь.

0 голосов
/ 26 июня 2011

Поскольку вы запрашивали комментарии не по теме: Вы забыли позвонить [super viewDidLoad]. Вам также не нужно повторно объявлять прототип, чтобы переопределить его. И @synthesize textFieldDelegate недопустим, так как у вас нет свойства в классе с именем textFieldDelegate. И ваш dealloc метод выпускает ивар с именем tfd, который, кажется, на самом деле не существует в классе.

Ваша настоящая проблема в том, что вы неправильно удерживаете контроллер вида в любой момент, когда вы его выделяете. Может случиться так, что контроллер представления создается в nib и ассоциируется с ivar, а не свойством, объявленным retain, или не связан ни с чем. Или это может быть то, что вы выделяете его в коде, добавляете его представление как подпредставление чего-либо, а затем освобождаете его, не сохраняя сам контроллер представления. Или, может быть, вы просто выпускаете его, когда не должны.

Ваш другой класс работает именно потому, что вы вытекаете объект, поэтому он никогда не освобождается. Лучшим решением, если бы вы использовали этот метод, было бы сохранить объект в иваре, когда вы выделите его, а затем отпустите его (и установите для ивара значение nil) в dealloc и viewDidUnload.

...