これは私にとってはまったく困惑しています。しかし、私は2つのペインを管理するView Controllerコンテナを作成しようとしています(SplitViewControllerに似ていますが、いくつかの重要な違いがあります)。私はやっとクラスを構築し始めてきたので、私は唯一の今3アイバーズを持っている:UIViewControllerのサブクラスはインスタンス変数を割り当てることができません
@implementation SplitViewController{
BOOL _showLeftPane;
UIViewController *_leftController;
UIViewController *_rightController;
}
どんなに私は何をすべきか、私は_leftController IVARにビューコントローラを割り当てることはできません。ほとんどの場合、_rightControllerはiVarが割り当てることができます。それはより奇妙になる。私がiVarsの順序を切り替えると、_leContControllerの前に_rightControllerが現れるので、最初の試行でどちらかを割り当てることはできません。しかし、私が再び試みると(文字通り2回の課題を書く)、_leftControllerがかかります。一貫して、コンソールを使用して割り当て直後のiVar宣言にリストされている最初のコントローラの値を要求すると、値は(UIViewController *) $5 = 0x00000001 [no Objective-C description available]
になります。 WTF?
好奇心から(私はほとんどクラスを書くことができなかったので)私はスーパービューをUIViewControllerからNSObjectに変更しました。私がそれをすると、割り当てが動作します。そして、実際には、このクラスのすべてが今すぐloadViewで空白のビューを作成するのと同じように割り当てられています。
私には何が欠けていますか?
更新 残りのコード:
全体.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;
}
元来、私はすべての通常のView Controllerをオーバーライドしていましたメソッド(loadView、viewDidLoad、etc ...)が、私はこの問題を解決するまでコメントアウトしています。 また、ARCを使用しています。
アップデート2 私は多分それはアイバーズが問題を提起クラスのUIViewControllerのものとしなければならなかった考え、シンプルなNSObjectのコンテナクラスを設定しようとしました。しかし、同じ問題が続く。したがって、UIViewControllerを別の変数にラップしても機能しません。また、iVarタイプを 'id'に変更しようとしましたが、問題は解決しません。
私はプロジェクトをきれいにして、clangスタティックアナライザを使ってロジックエラーをチェックしていることにも気付きたいと思います。
アップデート3 、このクラスのすべての割り当ては、多くの場合...「オフ」(常にではないが)、リスト内の次のIVARを割り当てています。ダミーのid iVarsを入れて、ランダムなオブジェクトを割り当てました。
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];
}
これは(ない値が代入後に変更されませんが、ないものは持っている私が得たものである:私はその後、各割り当てを通じて段階(私は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>
これはバグですか?もしそうなら、私はそれを提出するでしょうか?私は何が起こっているのか知りません....
更新4 私はそれが動作するようになったが、唯一の私のデバイス上で。私は一般に、シミュレータ上で大きな変更を最初に(より簡単に/より速くデバッグするために)実装し、デバイスでの性能をテストする傾向があります。さらに、私は私の余暇時間にそれをテストすることができるように私のデバイス上の作業バージョンを持っていることを好む。だから私は私のデバイスにインストールし、クラスは正常に動作します。シミュレータで壊れているようだ。これがなぜ起こったのかについてのアイデアはありますか?私は本当にデバイス開発だけで残りのプログラム開発をテストする必要はありません。それは物事を少し遅くします。
コードをいくつか追加できますか?上記の構文はうまくいくように見えるので、他のものでなければなりません。 –
追加するコードはそれほど多くありませんが、1分後に追加します。 –