2014-07-06 3 views
7

У меня есть простой подкласс UIViewController (код ниже). Если я присоединю inputAccessoryView, мой диспетчер представлений никогда не будет освобожден. Если я не установлю inputAccessoryView в viewDidLoad, dealloc вызывается как и ожидалось.UIViewController с inputAccessoryView не освобождается

Я что-то упустил?

@interface IMTestViewController : UIViewController 

@property (nonatomic, strong) UIView *messageInputView; 
@property(nonatomic, readwrite, strong) UIView *inputAccessoryView; 

@end 

@implementation IMTestViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)dealloc 
{ 

} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.inputAccessoryView = self.messageInputView; 
} 

- (BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 

- (UIView *)messageInputView 
{ 
    if (_messageInputView == nil) 
    { 
     _messageInputView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 45)]; 
     _messageInputView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
    } 
    return _messageInputView; 
} 
@end 

У меня кончились идеи. Спасибо.

+0

Вы хотите, чтобы этот inputAccessoryView был добавлен на клавиатуру, которая появляется? Если это так, вы делаете это неправильно. inputAccessoryView - это свойство в UITextField, а не UIViewController. Я не уверен, почему делать это таким образом, чтобы ваш контроллер не был освобожден, но если вы измените имя на нечто иное, чем inputAccessoryView, оно будет отменено правильно. Таким образом, кажется, что использование этого имени свойства неверно путает систему как-то. – rdelmar

+0

, пожалуйста, добавьте код, используемый для установки 'self.messageInputView' и кода, используемого для представления' IMTestViewController' – Rafeek

+0

@rdelmar, inputAccessoryView является свойством UIResponder, который является суперклассом UIViewController. – hybridcattt

ответ

7

К сожалению, для меня ответ @ rdelmar не работает. По прошествии некоторого времени, потраченного на его решение, я нашел эту статью: http://derpturkey.com/uitextfield-docked-like-ios-messenger/

Моя цель состоит в том, чтобы вид на входной аксессуар был видимым, даже если клавиатура отсутствует, точно так же, как во всех приложениях IM. Я ранее подклассифицировал свой собственный класс UIViewController, чтобы он стал первым ответчиком и возвратил мой пользовательский под просмотр как inputAccessoryView. Это препятствовало освобождению диспетчера представлений. Теперь я подклассию взгляда контроллера, чтобы достичь того же, что рекомендовано в ссылке выше, все, кажется, работает нормально.

EDIT: после некоторого тестирования я могу подтвердить, что пользовательский UIView освобожден просто отлично.

EDIT 2: только нижняя сторона - это то, что вы не можете заставить клавиатуру отображаться в viewWillAppear, inputAccessoryView еще не добавлен в иерархию представления и не может стать первым ответчиком.

+0

Ничего себе, отличная идея сделать вид ответчика, а не просматривать сам контроллер. И это решает проблему освобождения. Спасибо! – hybridcattt

+0

Это отличная находка, я искал решение этого в течение некоторого времени. – PPierson

Смежные вопросы