Объекты в файле пера, не связанные с объектами IBOutlet в коде

Хорошо, я дергаю себя за волосы, это не имеет смысла, так что это должно быть либо ошибка, либо какая-то чрезвычайно глупая ошибка, которую я совершаю.

Вот ситуация: у меня есть UIViewController с файлом xib. У него есть UIView, подключенный к свойству представления, UIImageView, подключенный к свойству с именем imageView, и UISegmentedControl, подключенный к segmentControl.

Тем не менее, в моем коде я не могу назначить изображение представлению изображения. Когда я NSLog объект, я получаю адрес 0x0, поэтому он вообще не связывается. У меня есть привязки, настроенные в конструкторе интерфейсов, я перезапустил XCode, очистил и построил проект. Ничего не работает, и я потратил глупое количество времени, пытаясь понять это на данный момент. Я также NSLoged объект segmentControl и также получаю 0x0. Таким образом, ничего из XIB не связывается с кодом, но загружается сам XIB, потому что объекты отображаются на экране.

У кого-нибудь есть идеи навскидку, что я мог упустить? Это такая простая вещь, что невероятно расстраивает, что она вдруг отказывается работать.


Вот код ниже, в этом случае я обращаюсь к объектам в установщике для projectId, но я также пытался получить доступ к imageView из другого класса, и это тоже не сработало (и да, у меня было объявление @property и синтез для imageView когда пробовал).

Диаграммвиевконтроллер.h:

#import <UIKit/UIKit.h>


@interface DiagramViewController : UIViewController 
{
    NSUInteger projectId;
    IBOutlet UIImageView *imageView;
    IBOutlet UISegmentedControl *segmentControl;
}

@property NSUInteger projectId;

@end

DiagramViewController.m:

#import "DiagramViewController.h"

@implementation DiagramViewController
@synthesize projectId;

-(void)setProjectId:(NSUInteger)projId
{
    NSLog(@"imageView: %@", imageView);
    NSLog(@"segmentControl: %@", segmentControl);

    projectId = projId;

    NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%i_schem", projectId] ofType:@"png" inDirectory:@"project-details/images/diagrams"];
    NSData *imageData = [NSData dataWithContentsOfFile:filePath];

    imageView.image = [UIImage imageWithData:imageData];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    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 {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc {
    [super dealloc];
}

@end

А вот изображение подключений Interface Builder: http://i52.tinypic.com/2eakprl.png


person Ben Baron    schedule 10.11.2010    source источник
comment
Опубликуйте какой-нибудь код из вашего контроллера, где эти вещи равны нулю и где вы их настраиваете. Мое первое подозрение заключается в том, что вы используете свойства геттера внутри -loadView, но я хотел бы увидеть код, чтобы мы могли правильно ответить на этот вопрос.   -  person jer    schedule 11.11.2010
comment
Обновил проект кодом и скриншотом IB, смысла в этом 0, это самый простой вьюконтроллер который я когда либо собирал и просто отказывается работать.   -  person Ben Baron    schedule 11.11.2010


Ответы (2)


Вы должны убедиться, что вы делаете это в методе -viewDidLoad, иначе файл пера фактически не разархивировал объекты, и поэтому они будут установлены на ноль. В частности, вы не можете получить доступ к элементам из пера в методе -init.

Однако, не видя вашего кода, трудно сказать, так ли это для вас.

РЕДАКТИРОВАТЬ: Хорошо, спасибо за размещение кода. Когда вызывается -setProjectId:? Вы уверены, что к этому моменту загрузка пера закончилась? У вас нет метода viewDidLoad в вашем контроллере представления, поэтому кажется, что вы никогда не проверяете это в любое время.

См.: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

viewDidLoad

Вызывается после загрузки представления контроллера в память.

  • (недействительно) viewDidLoad

Обсуждение

Этот метод вызывается после того, как контроллер представления загрузил связанные представления в память. Этот метод вызывается независимо от того, были ли представления сохранены в файле пера или созданы программно в методе loadView. Этот метод чаще всего используется для выполнения дополнительных шагов инициализации представлений, загружаемых из файлов пера.

person d11wtq    schedule 10.11.2010
comment
Спасибо! Переместил логику в метод viewWillAppear: и теперь он работает. Я обычно создаю свои контроллеры представления в методах viewDidLoad или viewWillAppear:, не уверен, почему на этот раз я делал это по-другому. Я знал, что это должна была быть какая-то глупая ошибка, которую я совершал. Спасибо еще раз! - person Ben Baron; 11.11.2010

Похоже, что-то пошло не так, когда вы подключили IBOutlets.

В IB щелкните правой кнопкой мыши на UISegmentedControl и опубликуйте скриншот, чтобы мы могли видеть, что у вас там есть. Если вы видите что-то «желтое», возможно, вы нашли свою проблему.

person nicktmro    schedule 10.11.2010
comment
Боюсь, это не так просто. Я проверил все очевидное. Нет причин, по которым я вижу, что это не работает. Меня это действительно бесит. - person Ben Baron; 11.11.2010
comment
Смотрите обновление к моему сообщению. Я включил код и скриншот из IB - person Ben Baron; 11.11.2010
comment
Маловероятно, что объекты не загружаются. Гораздо более вероятно, что они не загружены в то время, когда к ним обращаются. При работе с перьями вам необходимо убедиться, что вы реализуете методы, обеспечивающие обратную связь о состоянии содержимого перьев (например, -viewDidLoad в UIViewController). - person d11wtq; 11.11.2010
comment
Объявите свойства и синтезируйте segmentedControl и imageView, возможно, это поможет. - person nicktmro; 11.11.2010