Инициализация элементов управления в пользовательском интерфейсе - PullRequest
1 голос
/ 26 января 2011

Я создал пользовательский интерфейс в IB и установил класс для него.

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface myView : UIControl {
    IBOutlet UITextView *textView;
}
@end

#import "myView.h"

@implementation myView

- (void)commonInit
{
    [textView setText:@"lajsdfklasdfjl"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder])
    {
        [self commonInit];
    }
    return self;
}

-(id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        [self commonInit];
    }
    return self;
}

@end

Я поместил текстовое представление с текстом этого представления в IB и связал его с IBOutlet IUTextView * textView. Когда я перетаскиваю это пользовательское представление на свой UIViewController (со вкладки классов в библиотеке IB), представление становится пустым. - (id) initWithCoder: (NSCoder *) aDecoder вызывает, но textView является нулевым. Что случилось? Спасибо

Ответы [ 2 ]

8 голосов
/ 26 января 2011

Насколько я помню, иерархия не правильно настроена в init, так как свойства могут быть установлены только после завершения init.

Вы хотите использовать

-(void)awakeFromNib
{
    [super awakeFromNib];
    [self commonInit];
}

вместо этого и полностью удалите initWithCoder:.

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

0 голосов
/ 14 ноября 2012

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

Затем можно удалить следующие 3 метода экземпляра

* 1004.*

и в вашем пользовательском классе UIViewController используйте initWithNibName, как показано ниже

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        self.view.frame = CGRectMake(0, 44, self.view.frame.size.width, self.view.frame.size.height);
    }
    return self;
}

Этот метод экземпляра initWithNibName будет вызываться автоматически при выделении вашего пользовательского класса UIViewController следующим образом

CustomUIViewController *vc = [[CustomUIViewController alloc] init];

точка останова в initWithNibName, и вы увидите, что она называется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...