4

私はiOS開発に比較的慣れておらず、アプリを計画しています。アプリには、画面全体を占めるいくつかの異なるシーン/ViewControllers があります。

画面の左上に、現在表示されているVCに関係なく、ユーザーをホームページに戻す小さなボタンを常に配置するつもりです。

すべてのviewControllerのビューに個別の同一のボタンを配置できますが、それはエレガントで壊れやすいようです。

View Controllers Programming ガイドを読んだ後の私の本能は、ルート VC となる View Controller Container を作成することです。この VC には 2 つの子 VC があります。事実上、新しいルート VC になります。)

これは、より経験豊富な iOS 開発者にとって賢明な解決策のように思えますか? もっと簡単な解決策はありますか?

ありがたいアドバイスをいただきました。

4

2 に答える 2

1

それがおそらくあなたの最善の解決策だと思います。iOS では、ViewController はそのビューに使用できるすべてのスペースを占有します。自分で管理する「コンテナ」ビューがないと、作成したビュー コントローラはウィンドウ全体を占有し、表示したものすべてをカバーします。

ただし、プロジェクトによっては、より簡単な代替アプローチがあります。

中央の場所 (App Delegate クラスなど) に UIView オブジェクト (ボタン) を作成できます。そのビューには、メソッドにアタッチするボタンを含めることができます。

@implementation AppDelegate

- (void) someSetupMethod {
    UIButton* b = [UIButton buttonWithType:UIButtonTypeCustom];
    // setup whatever properties

    // Now set button to call a method *on this AppDelegate object* ("self"):
    [b addTarget:self action:@selector(homeButtonTapped:) forControlEvents:UIControlEventTouchUpInside];

    // Store the button definition somewhere permanant
    self.reusableHomeButton = b;
}

- (void) homeButtonTapped:(id)sender {
    // do something to pop view controllers back to what you want.
}

次に、View Controller で、表示時にすべてホーム ボタンを表示できます。

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

    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
    [self.view addSubview:appDelegate.reusableHomeButton];
}

[view addSubview:...]これは、ビューがすでに何らかの親にある場合、最初にその親からビューを削除してから、新しいビューに追加するという意図的な副作用を利用しています。

また、ボタンがそのメッセージを任意のオブジェクトに送信できるという事実も利用しています。ボタンの親ビューをホストする ViewController である必要はありません。

これにより、新しいコントローラーが表示されるたびに、表示されているビューコントローラーの .view から新しいビューにボタンが「移動」されます。

ボタンには AppDelegate オブジェクトのターゲットがあるため (したがって、そのメッセージをそのオブジェクトに送信します)、メッセージを受信するアプリ デリゲート オブジェクトが存在する限り、「どこからでも」機能します (アプリがが走っています)。

于 2013-03-10T20:43:51.003 に答える
0

Swift を使用すると、プロトコルとプロトコル拡張機能を利用できます。このアプローチについて記事を書きました。要するに、次のものが必要です。

  1. オーバーレイ ビュー コントローラーを記述するプロトコルを作成します。
  2. プロトコル拡張を使用して、View Controller をそのプロトコルに提示/破棄するロジックをカプセル化します。
  3. オーバーレイ ホストのプロトコルを作成します。
  4. プロトコル拡張を使用して、ストーリーボードからそのプロトコルにオーバーレイ ビュー コントローラーをインスタンス化するロジックをカプセル化します。

これで準備完了です。使用法は次のようになります。

class ViewController: UIViewController, OverlayHost {
    @IBAction func showOverlayButtonPressed() {
        showOverlay(type: YourOverlayViewController.self, 
            fromStoryboardWithName: "Main")
    }
}

ソースコード: https://github.com/agordeev/OverlayViewController

于 2017-04-22T07:46:37.517 に答える