Несколько IBOutlets, указывающих на ноль - PullRequest
2 голосов
/ 09 февраля 2012

Через некоторое время я наконец-то снова начал работать с Objective-C, пока над моим единственным законченным приложением. Цель состоит в том, чтобы в конечном итоге провести рефакторинг для ARC и, возможно, раскадровок, но пока я полирую цель iOS 4.x. Я довольно ржавый, так что держи меня в покое, если это глупый вопрос.

У меня на главном экране есть кнопка, которая вызывает метод showAction. Метод заключается в следующем:

- (void)showAbout
{
    AboutViewController *aboutView = [[[AboutViewController alloc] init] autorelease];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        aboutView.modalPresentationStyle = UIModalPresentationFormSheet;
    }
    else
    {
        aboutView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    }
    [self presentModalViewController:aboutView animated:YES];
}

Класс AboutViewController имеет это .h:

@interface AboutViewController : UIViewController <UIActionSheetDelegate, MFMailComposeViewControllerDelegate> {
}

- (IBAction)dismiss:(UIButton *)sender;
- (IBAction)feedback:(UIButton *)sender;

@property (retain) IBOutlet UIButton *dismissButton;
@property (retain) IBOutlet UIButton *feedbackButton;
@property (retain) IBOutlet UIImageView *background;
@property (retain) IBOutlet UITextView *textView;

@end

и все было правильно подключено в файле .xib (то же самое для iPhone и iPad). Действия запускаются, как и ожидалось, и розетки доступны, но только на iPhone. При работе на iPad только textView правильно инициализируется, а все остальное указывает на ноль.

В .m я пробовал это:

@implementation AboutViewController

@synthesize dismissButton = _dismissButton;
@synthesize feedbackButton = _feedbackButton;
@synthesize background = _background;
@synthesize textView = _textView;

// ...

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    NSLog(@"obj self.dismiss: %@", self.dismissButton);
    NSLog(@"frame dismiss: %@", NSStringFromCGRect(self.dismissButton.frame));
}

На iPhone я получаю это:

2012-02-08 22:51:00.341 myapp[17290:207] obj self.dismiss: <UIButton: 0x70281d0; frame = (180 410; 120 30); opaque = NO; autoresize = LM+W+RM+TM; layer = <CALayer: 0x7028260>>
2012-02-08 22:51:00.342 myapp[17290:207] frame dismiss: {{180, 410}, {120, 30}}

На iPad вместо этого я получаю:

2012-02-08 22:51:40.428 myapp[17320:207] obj self.dismiss: (null)
2012-02-08 22:51:40.428 myapp[17320:207] frame dismiss: {{0, 0}, {0, 0}}

Больше ничего не происходит в зависимости от идиомы пользовательского интерфейса, и я действительно смущен этим. Как будто на iPad выходы для чего-либо кроме textView не установлены, даже если они правильно связаны в файле .xib. В viewWillAppear self.textView работает, как и ожидалось, также на iPad. Я также попытался сделать это в viewDidLoad, который должен вызываться перед viewWillAppear, если я не ошибаюсь, и даже в методе dismiss :, но они просто никогда не доступны.

Причина, по которой мне нужен доступ к фреймам кнопок, заключается в том, что представление about относительно сложное и не может автоматически переместить свои подпредставления. Единственное, что мне нужно сделать, это сделать кнопки шире на большом модальном виде на iPad.

Любые советы будут с благодарностью!

Заранее спасибо.

1 Ответ

2 голосов
/ 21 февраля 2013

У вас когда-нибудь были отдельные .xibs для iPad и iPhone? Если так, то у вас может быть та же проблема, что и у меня. Так продолжалось до тех пор, пока @AliSoftware не поделилась со мной знаниями:

UIView в iPad на нуле, а не на iPhone

По сути, вам нужно:

  1. Удалить каталог продуктов сборки
  2. Удалить приложение из всех ваших симуляторов
  3. Сборка и запуск

Я считаю, что проблема в том, что призрачный .xib для iPad зависал, вызывая проблемы. Истинная очистка приложений сделала свое дело. Удачи!

...