以前はコードを使用していた場所でIBの使用を試み始めています。私はiPad/iPhoneのポートレート/風景用のペン先を作成したので、4つのビューがあります。すべてのファイル所有者がUIViewControllerに設定されていますが、すべてパレットセットからNSObjectサブクラス "TargetObject"にオブジェクトが追加されています。 IBActions/IBOutletsの設定は問題ありません。いつものようにCtrlキーを押しながらドラッグして1つのペン先にコードを作成し、オブジェクトを右クリックして、アクション/アウトレットを他のペンの右のコントロールにドラッグして、ペン先。アイデアは、アプリケーションデリゲートが現在のデバイスの適切なビューコントローラを起動し、そのビューコントローラが方向に応じて正しいビューを読み込むというものです。共通ターゲットオブジェクトを使用して複数のビューのアクション/アウトレットを処理する方法は?
(このアプローチは必要ありません - このようなIBコントロールだけでレイアウトを並べ替えることは非常に苛立っていますので、この方法を実行することが可能かどうかを知りたい)
これらの1対多のビューとターゲットオブジェクトの背後にあるアイデアは、アプリ内のどこにでも使用できるということです。たとえば、コアデータにオブジェクトである何かが表示されている場合は、 と私は詳細ビュー/アプリケーションの複数の場所で編集できるようにしたいと思います。これは非常にMVCのやり方のようです。私が行うとき
問題は、ビューコントローラのloadViewメソッドで提供されます:
NSArray *portraitViewArray = [[NSBundle mainBundle] loadNibNamed:@"Weekview_iPad_Portrait" owner:self options:nil];
portraitWeekView = [portraitViewArray objectAtIndex:0];
NSArray *landscapeViewArray = [[NSBundle mainBundle] loadNibNamed:@"Weekview_iPad_Landscape" owner:self options:nil];
landscapeWeekView = [landscapeViewArray objectAtIndex:0];
// this object is intended to be a common target for portrait and landscape arrays.
weekViewTarget = [portraitViewArray objectAtIndex:1];
UIInterfaceOrientation interfaceOrientation = self.interfaceOrientation;
if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
self.view = portraitWeekView;
else
self.view = landscapeWeekView;
あなたが推測として、すべてがターゲットオブジェクトがクラッシュしたとの対話縦向きではなく、風景の中に細かいです。 weekViewTargetオブジェクトは、ポートレート・ビューで作成されたオブジェクトを参照するため、参照で保持されていない別のインスタンスがランドスケープ・ビューで検索されています。ランドスケープビューでは、_viewDelegateはnilです。プライベートなので、コードで修正することはできません。
私は風景ターゲットオブジェクトを参照で保持することもできますが、向きが変わるたびに問題が発生します - UITableViewなどのステートフルコントロールの場合、データソース/デリゲートが変更され、回転時のユーザーエクスペリエンスが変わります。ターゲットオブジェクトが単純なアクションだけを実装し、別の共有オブジェクトを使用して、必要なテーブルビューまたはテキストビューのデータソース/デリゲートオブジェクトを実装することを保証しない限り、
私が考えていることの1つは、ターゲットをシングルトンにすることです。ハックのように見えますが、ここではうまくいかない時が来ます。
一般的なターゲットオブジェクトを使用してモデルに要素を加えて、複数のビューを作成してペン先として実装する正しい方法はありますか?
進展 - 物事は私が独自の型に各ターゲットのポインタを与える場合は作業を開始:
WeekViewTarget *forwardTarget;
と、次のように使用されていないハンドラのforwardTargetが設定されている間、実際のハンドラのforwardTarget = nil
をしましょう:
weekViewTarget = [portraitViewArray objectAtIndex:1];
forwardedWeekViewTarget = [landscapeViewArray objectAtIndex:1];
forwardedWeekViewTarget.forwardTarget = weekViewTarget;
、その後は各IBActionで次の操作を行います。
- (IBAction)timeBlockTapped:(id)sender {
if(forwardTarget != nil) {
[forwardTarget performSelector:@selector(timeBlockTapped:) withObject:sender];
} else {
NSLog(@"Got a tap event with sender %@", [sender description]);
}
}
まだ気分が良くなりません。
風景/肖像画の回転に別のxibをデザインする必要はありません。あなたはちょうど別のxibをiPhoneとiPad用に分けなければなりません。クラッシュ中にコンソールに表示されるエラーメッセージを投稿できますか? –
クラッシュが分かっています。これは、portraitViewArrayのように、landscapeViewArrayのloadNibNamedから返されたNSObjectにぶら下がっていないことです。これで、元の投稿の「進捗状況」の後に記述された変更がすべて処理されます。私はそれがすべきだと思うよりもまだ少し難しく複雑です。離散的なポートレート/風景のペン先の代わりに、ストラットとスプリングを使用する方法はありますか?これまでこれまでに多くの成功を収めていませんでした。 –