Это совершенно непонятно для меня, заставляя меня думать, что я пропустил что-то важное. Но я пытаюсь создать контейнер контроллера представления для управления двумя панелями (аналогично SplitViewController, но с некоторыми существенными отличиями). Я только начал строить класс, так что я получил только 3 Иварс прямо сейчас:Подкласс UIViewController не может назначать переменную экземпляра
@implementation SplitViewController{
BOOL _showLeftPane;
UIViewController *_leftController;
UIViewController *_rightController;
}
Независимо от того, что я делаю, я не могу назначить контроллер представления в _leftController Ивар. В основном, iRAar_rightController может назначаться. Это становится более странным. Если я переключу порядок iVars, то _rightController появится перед _leftController, я не могу назначить ни одного с первой попытки. Однако, если я попробую еще раз (буквально напишу назначение дважды), то возьмет _leftController. Последовательно, когда я использую консоль для запроса значения первого контроллера, указанного в объявлениях iVar сразу после назначения, значение, которое я получаю, равно (UIViewController *) $5 = 0x00000001 [no Objective-C description available]
. WTF?
Из любопытства (и потому, что я могу ... Я только начал писать класс) Я сменил супер с UIViewController на NSObject. Когда я это делаю, работа выполняется. И действительно, назначение - это почти все, что сейчас делает этот класс рядом с созданием пустого представления на loadView.
Что мне не хватает?
Update Остальная часть кода:
Весь .h файл:
#import <UIKit/UIKit.h>
@interface SplitViewController : UIViewController
@property (strong) UIViewController *leftViewController;
@property (strong) UIViewController *rightViewController;
@end
Весь .m файл (обратите внимание, я пытался синтезировать свойства, такое же поведение, за исключением сложнее отлаживать консоль):
@implementation SplitViewController{
BOOL _showLeftPane;
UIViewController *_rightNavController;
UIViewController *_leftNavController;
}
#pragma mark - Init Methods
- (id)init{
if (self = [super initWithNibName:nil bundle:nil]){
_showLeftPane = YES;
}
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
#pragma mark - Properties
- (void) setLeftViewController:(UIViewController *)leftViewController{
_leftNavController = leftViewController;
}
- (UIViewController *) leftViewController{
return _leftNavController;
}
- (void) setRightViewController:(UIViewController *)rightViewController{
_rightNavController = rightViewController;
}
- (UIViewController *) rightViewController{
return _rightNavController;
}
Первоначально, у меня был весь обычный контроллер просмотра, переопределенный методы (loadView, viewDidLoad и т. д.), но я с тех пор прокомментировал их, пока не смогу устранить эту проблему. Кроме того, я использую ARC.
Update 2 Я попытался создать простой NSObject контейнерный класс, думая, может быть, это было связано с Иварс быть класса UIViewController, что постановку задачи. Но та же проблема сохраняется. Поэтому перенос UIViewController в другую переменную не работает. Я также пытался изменить тип iVar на «id», но проблема сохраняется.
Я также хотел бы отметить, что я очистил проект и использовал статический анализатор clang для проверки логических ошибок.
Update 3 Все задание в этом классе «Выключено» ... часто (но не всегда) назначение следующего Ивар в списке. Я вложил кучу фиктивных идентификаторов iVars и назначил им случайные объекты. Затем я прошел через каждое задание (которое я ставлю в INIT) и протестировал значение до и после присваивания:
if (self = [super initWithNibName:nil bundle:nil]) {
_showLeftPane = YES;
_dummy1 = [[NSObject alloc] init];
_dummy2 = [[UIView alloc] init];
_dummy3 = [[NSNumber alloc] init];
_dummy4 = [[NSString alloc] init];
_dummy5 = [[NSValue alloc] init];
_dummy6 = [[UIColor alloc] init];
_dummy7 = [[NSCache alloc] init];
_dummy8 = [[UIButton alloc] init];
_dummy9 = [[UIFont alloc] init];
_rightController = [[UIViewController alloc] init];
_leftController = [[UIViewController alloc] init];
}
Это то, что я получил (а не значения не изменяются после присваивания, но те, которые имеют значения часто относятся к предыдущему назначению). :
(lldb) po _showLeftPane
(BOOL) $2 = '\0' <nil>
(lldb) po _showLeftPane
(BOOL) $4 = '\0' <nil>
(lldb) po _dummy1
(id) $6 = 0x00000001 [no Objective-C description available]
(lldb) po _dummy1
(id) $8 = 0x00000001 [no Objective-C description available]
(lldb) po _dummy2
(id) $9 = 0x0a0461e0 <NSObject: 0xa0461e0>
(lldb) po _dummy2
(id) $11 = 0x0a0461e0 <NSObject: 0xa0461e0>
(lldb) po _dummy3
(id) $12 = 0x0866f340 <UIView: 0x866f340; frame = (0 0; 0 0); layer = <CALayer: 0xa05a790>>
(lldb) po _dummy3
(id) $14 = 0x0866f340 <UIView: 0x866f340; frame = (0 0; 0 0); layer = <CALayer: 0xa05a790>>
(lldb) po _dummy4
(id) $15 = 0x00000000 <nil>
(lldb) po _dummy4
(id) $17 = 0x00000000 <nil>
(lldb) po _dummy5
(id) $18 = 0x017c5a7c <object returned empty description>
(lldb) po _dummy5
(id) $20 = 0x017c5a7c <object returned empty description>
(lldb) po _dummy6
(id) $21 = 0x00000000 <nil>
(lldb) po _dummy6
(id) $23 = 0x00000000 <nil>
(lldb) po _dummy7
(id) $24 = 0x0865d300 <UIPlaceholderColor: 0x865d300>
(lldb) po _dummy7
(id) $26 = 0x0865d300 <UIPlaceholderColor: 0x865d300>
(lldb) po _dummy8
(id) $27 = 0x0a230af0 <NSCache: 0xa230af0>
(lldb) po _dummy8
(id) $29 = 0x0a230af0 <NSCache: 0xa230af0>
(lldb) po _dummy9
(id) $30 = 0x08637350 <UIButton: 0x8637350; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x8484920>>
(lldb) po _dummy9
(id) $32 = 0x08637350 <UIButton: 0x8637350; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x8484920>>
(lldb) po _rightController
(UIViewController *) $33 = 0x00000000 <nil>
(lldb) po _rightController
(UIViewController *) $35 = 0x00000000 <nil>
(lldb) po _leftController
(UIViewController *) $36 = 0x0a065180 <UIViewController: 0xa065180>
(lldb) po _leftController
(UIViewController *) $38 = 0x0a065180 <UIViewController: 0xa065180>
Итак, э-э ... это ошибка? Если да, то каким образом я могу его записать? Я даже не знаю, что происходит.
Update 4 Я получил его на работу, но только на моем устройстве. Обычно я стараюсь сначала выполнить основные изменения на симуляторе (проще/быстрее отлаживать), а затем проверить его на производительность на устройстве. Кроме того, я предпочитаю иметь рабочую версию на своем устройстве, чтобы я мог проверить ее в свое свободное время. Поэтому я установил его на свое устройство, и класс отлично работает. Кажется, что он только сломан в симуляторе. Любые идеи о том, почему это может быть? Я действительно не хочу тестировать остальную часть моей программы на устройстве в одиночку. Это немного замедлит.
Можете ли вы дать нам еще один код. Ваш синтаксис выше кажется прекрасным, поэтому он должен быть чем-то другим. –
Ну, не так уж много кода, чтобы добавить, но я добавлю его через минуту. –