Пользовательский UIView с пользовательским XIB: IBOutlets не работает - PullRequest
2 голосов
/ 06 февраля 2012

Я разрабатываю приложение для iOS с последним SDK и XCode 4.2.

Я хочу использовать пользовательский XIB в пользовательском UIView.

Мой пользовательский UIView:

@interface CoordinateView : UIView {
    /**
     */
    ARGeoCoordinate *geoCoordinate;
    /**
     */
    IBOutlet UILabel* title;
    /**
     */
    IBOutlet UILabel* subTitle;
    /**
     */
    IBOutlet UIImageView* image;
}

Реализация:

@implementation CoordinateView

@synthesize geoCoordinate;

- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        // Initialization code.
        //
        NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CoordinateView" owner:nil options:nil];
        for(id currentObject in topLevelObjects)
        {
            if ([currentObject isKindOfClass:[CoordinateView class]])
            {
                [self addSubview:currentObject];
                break;
            }
        }
    }
    return self;
}

- (id)initForCoordinate:(ARGeoCoordinate *)coordinate
{
    self.geoCoordinate = coordinate;
    CGRect theFrame = CGRectMake(0, 0, BOX_WIDTH, BOX_HEIGHT);

    self = [self initWithFrame:theFrame];
    if (self)
    {
        title.text = geoCoordinate.title;
        image.image = [UIImage imageNamed:[NSString stringWithFormat:@"03%d.jpg", geoCoordinate.id]];
    }
    return self;
}

Для инициализации CoordinateView я использую метод initWithCoordinate.

Отладка Я обнаружил, что title это ноль здесь initWithCoordinate:

title.text = geoCoordinate.title;

Я использовал Interface Builder для «связывания» IBOutlets.

Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 03 декабря 2013

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

  1. В xib откройте схему документа (на левой панели отображается список видов и их подпредставлений и т. Д.).
  2. Control left Нажмите на представление, представляющее ваш класс (в вашем случае CoordinateView) и перетащите синюю линию вниз к подпредставлениям (в вашем случае UILabel называется title)
  3. Затем XCode должен вызвать небольшое диалоговое окно с опцией «title» (потому что ваша метка называется title.)
  4. Нажмите на заголовок и wallaa.
  5. Вернитесь к отладке и проверьте, все ли ваши выходы равны нулю.

Просто личное предпочтение (необязательно связанное с обсуждаемой темой): я бы назвал вашу UILabel «titleLabel» вместо «title», потому что [objectInstance title] выглядит так, как будто он возвращает строку NSString кому-то, кто этого не знает 'title' - это UILabel. Просто личное предпочтение, вот и все.

Приветствия

1 голос
/ 07 февраля 2012

В вашем методе initWithFrame: вы должны назначить self на currentObject вместо добавления его в качестве подпредставления.

Также нет необходимости переопределять initWithFrame: и вызывать метод superпоскольку макет вашего представления определяется вашим файлом xib.

0 голосов
/ 06 февраля 2012

Когда представление полностью загружено, вызывается метод viewDidLoad.Итак, вы должны инициализировать элементы в представлении:

- (void)viewDidLoad {
    title.text = self.geoCoordinate.title;
}

Дополнительная информация в документах .

...