2015-12-22 7 views
0

Я получаю странное поведение.UIStackView вызов вызова возвращает ноль только на фактическом ipad, а не на симуляторе

UIStackView *stackView = [UIStackView alloc]; 
stackView = [stackView initWithArrangedSubviews:@[self.subview1,self.subview2]]; 
[self addSubview:stackView]; 
[stackView setTranslatesAutoresizingMaskIntoConstraints:NO] 
[self addConstraint:[NSLayoutConstraint constraintWithItem:stackView attribute: NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:0]] 

Этот код прекрасно работает, когда я использую тренажер Ipad Air 2 из XCode, но когда я на самом деле пытаюсь запустить его на моем Ipad 2 воздуха, он падает при попытке добавить ограничение макета (последнюю строку кода), жалуясь, что stackView - nil.

После прохождения кода я на самом деле обнаружил, что stackView является nil после первой строки, звонок [UIStackView alloc]. Это странно для меня, так как я не знаю, почему вызов alloc будет return nil, а тем более почему он будет return nil только на реальном устройстве, а не на моделировании устройства.

Edit:

Я первоначально имел код следующим образом:

UIStackView * stackView = [[UIStackView alloc] initWithArrangedSubviews:@[self.subview1,self.subview2]]; 
[self addSubview:stackView]; 
[stackView setTranslatesAutoresizingMaskIntoConstraints:NO] 
[self addConstraint:[NSLayoutConstraint constraintWithItem:stackView attribute: NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:0]] 

В этом случае stackView был nil после комбинированного alloc/init вызова, но я не знаю, какой из них сделал это nil. Поэтому я отделил звонки, чтобы посмотреть.

+0

Ваш iPad работает под управлением iOS 9? – dan

+0

Да, он работает iOS 9.2 –

ответ

0

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

UIStackView *stackView = [[UIStackView alloc] init]; 

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

Разница между фактическим устройством и симулятором может быть отнесена к ARC, работающему с различными интервалами на тренажере. Еще одна причина всегда проверять код на самом устройстве сначала! ;)

+0

У меня было такое, как будто у вас было это для начала, но я разделил его на два отдельных оператора, alloc и init. Я думаю, что делать вызовы alloc и init отдельно, так как я держу ссылку на UIStackView. –

+0

Независимо от того, когда у меня это было, как вы показываете, stackView был равен нулю после вызова alloc/init. Это означает, что вызов alloc или init был неудачным, и я не знаю, почему –