web-dev-qa-db-ja.com

画面上の現在のビューのユーザー操作を無効にする

私のアプリには多くのビューとそれぞれのコントローラーがあります。これで、ビジネスロジックが組み込まれた一連のモデルクラスができました。モデルクラスの1つ(NSObjectのサブクラス)は、セキュリティの管理を担当します。これは、Webサーバーからの特定の指示をリッスンすることを目的とした機能であり、サーバーから「無効化」メッセージが届いた場合は、UIを無効にして以降の使用を禁止します。

これで、「無効化」メッセージがアプリの機能中にいつでも届き、どのビューも画面に表示されます。 (モデルクラスから)ユーザーに表示されるビューを決定し、そのビューに対するユーザー操作を無効にするにはどうすればよいですか?

35
Vin

たぶん、アプリケーション全体がまったく反応しないようにしたいですか?

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

使用する [[UIApplication sharedApplication] endIgnoringInteractionEvents];これを元に戻すには(クレジットを裏に)

swiftでも同じです。

UIApplication.sharedApplication().beginIgnoringInteractionEvents()
UIApplication.sharedApplication().endIgnoringInteractionEvents()

およびSwift 3/4

UIApplication.shared.beginIgnoringInteractionEvents()
UIApplication.shared.endIgnoringInteractionEvents()
112
Gotschi

Swift 3のコードは次のとおりです。

UIApplication.shared.beginIgnoringInteractionEvents() 
UIApplication.shared.endIgnoringInteractionEvents()

構文のわずかな更新

3
mightyr

私はこれに非常に似たことをしました。他のすべての上に半透明の黒いビューを配置することにより、すべてのユーザーインタラクションを無効にします。これにより、UI全体が無効になっているという事実が視覚的に識別され、すべてのタッチイベントがブロックされます。通常、ビューコントローラーのビューをウィンドウに追加した後、このビューをウィンドウクラスに追加し、不要な場合は非表示にします。

2
Micah Hainline

サーバーをリッスンしているクラスにデリゲートを追加することもできます。そのため、そのメッセージを受け取ったときは、デリゲートがだれかに対してdisableを呼び出します。メッセージを取得するために表示されているビューと、メッセージが受信されるまでの通常の実行。シングルトンの場合は、ビューをviewWillAppearのデリゲートとして設定するだけです。

別の実行可能なオプションは、通知センターを使用することです。クラスが無効化メッセージを受け取ったら

[[NSNotificationCenter defaultCenter] postNotificationName:@"disableView" object:nil];

ビューがロードされたら、それらを追加してリスニングします

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disableView:) name:@"disableView" object:nil];

その後、必要のないときに聴くのをやめます。

UIViewControllerをサブクラス化し、無効化機能を実装してから、他のすべてのView Controllerでそのクラスをサブクラス化すると、コードの重複がなくなります。

1
utahwithak

アプリ全体のインタラクションを無効にするのに少し躊躇しています-これはあまりにも積極的で煩わしく、View ControllerがSplit View Controller内にある場合はどうなりますか?その後、両方のView Controllerが無効になります!

代わりに、クリアな色のビューコントローラーを作成し、モーダルで表示することができます。以下のSwift 2の例を参照してください。

private func TransparentViewController() -> UIViewController {
  let transparentViewController = UIViewController(nibName: nil, bundle: nil)
  transparentViewController.modalPresentationStyle = .OverCurrentContext
  transparentViewController.modalTransitionStyle = .CrossDissolve
  transparentViewController.view.backgroundColor = UIColor.clearColor()
  return transparentViewController
}

そして今、あなたはHUDを提示する前に、ビューコントローラー内からそれを提示することができます:

let transparentViewController = TransparentViewController()
self.presentViewController(transparentViewController, animated:false, completion: nil) 

お役に立てれば!

1
Zorayr

次のコードを使用して、バックグラウンドとの相互作用を無効にします

//Ignore interaction for background activities
[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

インタラクションを有効にする場合は、次のスニペットを使用します

if ([[UIApplication sharedApplication] isIgnoringInteractionEvents]) {

    // Start interaction with application
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}
1

これがSwift 2.2 iOS 9.3のコードです。

UIApplication.sharedApplication().beginIgnoringInteractionEvents()
UIApplication.sharedApplication().endIgnoringInteractionEvents()

それを頻繁に使用し、私にとってはチャンピオンのように動作し、API呼び出しを行う多くのIBActionを含むビューに非常に役立ち、最初の応答を待つ間に別の呼び出しを行いたくない

0
Huy Vu