9

この質問に似ていますが、一般的なソリューションまたは設計パターンまたはフレームワークを探しています。

Q. 既存のコントロールのクラスを書き直す必要なく、iOS アプリのすべての UI コントロールに状態管理を自動的に追加するにはどうすればよいですか?

例:

たとえば、 をクリックするUIButtonと、新しいUIWebViewGoogle ホームページが表示されます。これは簡単ですが、ユーザーが時々ボタンをクリックするのが速すぎると問題が発生するため、2 つの webview が表示されます。

この問題を解決するには、webview を含み、状態変数を持つシングルトン クラスを作成する必要があります。isOpendedそれが true の場合は、新しい webview を作成する代わりに既存の webview を再利用します。

しかし、問題は次のとおりです。他のコントロールでもこの​​動作が必要な場合は、多くのシングルトン クラスを作成する必要があります。ホイールを再発明するための新しいものを使用せずに、これを処理するより良い方法があるかどうかを考えています。

ありがとう。

4

4 に答える 4

9

ここで間違った問題を解決していると思います。UIWebView の処理が完了するまで、ボタンを無効にしないでください。そうすれば、ユーザーはそれを 2 回クリックできなくなります。

- (IBAction)showMapHomepage:(UIButton*)sender
{
    sender.enabled = NO;
    [self taskThatTakesALongTimeWithCompletion:^{
        sender.enabled = YES;
        // Finish processing
    }];
}
于 2012-06-03T19:19:53.060 に答える
4

問題を解決する最善の方法を誤解しています。まず第一に、多くのシングルトンを作成している状況に陥ってはいけません。シングルトンは必要悪ですが、使いすぎたり悪用したりしないでください。これは、 objective-c のシングルトンに関する良い投稿です。

ユーザーがボタンをクリックしたときに 2 番目の UIWebView が表示されないようにする方法は多数あります。

他の誰かが述べたように、1 つの解決策は、ユーザーがボタンを「ダブルクリック」できないようにボタンを無効にすることです。これを行うには、次を使用します。

button.enabled = NO;

次を使用してボタンを非表示にすることもできます。

button.hidden = YES;

または、UIButton を含むクラスのヘッダーで、ボタンが押されたかどうかのロジックを処理するブール値を作成できます。

// declare this in your header
BOOL buttonPressed;

// this is the IBAction that your button hooks up to
- (IBAction)createWebViewButtonPressed:(id)sender {
    if(!buttonPressed) {
        buttonPressed = YES;
        // insert code here to create your UIWebView
    }
}

繰り返しますが、やろうとしていることを達成する方法はたくさんあります。どの方法が最適かを判断する必要があります。

于 2012-06-07T04:30:49.843 に答える
4

コントロールを2回アクティブにしたくない場合は、おそらくコントロールを無効にする必要があるという他の回答に同意します。ただし、すべてのコントロールで使用できる一般的なパターンに関する実際の質問に対する回答が必要な場合は、関連するオブジェクトを使用できます...

- (IBAction)buttonAction:(UIButton*)sender
{
    NSString* webViewKey = @"AssociatedWebView";
    // See if there is web view already
    id webView = objc_getAssociatedObject(sender, webViewKey);
    if(webView == nil)
    {
        // There is no existing web view, create it
        webView = [self theWebView];
        // Associate it with the button
        objc_setAssociatedObject(sender, webViewKey, webView, OBJC_ASSOCIATION_RETAIN);
        // Add the web view
        [self.view addSubview:webView];
    }
}

上記は、オブジェクトをインスタンスに関連付ける一般的な方法を示しているUIButtonため、既に関連付けられているかどうかを確認し、既存のものを再利用できます。質問で完全に説明されていない他の方法でこれを使用する場合に備えて、この回答を提供しますが、実際には、コントローラーのプロパティがまだない場合はwebView、遅延ロードするためにコントローラーのプロパティを使用できますwebView読み込まれました。

質問で議論しているシングルトン スタイルを本当にシミュレートしたい場合(既に存在する場合UIButtonは同じオブジェクトをすべて共有する多くのインスタンスを持つことができるようにするため) 、特定のオブジェクトの代わりにオブジェクトまたはオブジェクトに関連付けることができます。実例。これを行うには、上記のコードのをに置き換えます。webViewwebView[UIButton class][UIControl class]sender[UIControl class]

于 2012-06-07T20:01:22.587 に答える
3

考えられる解決策の 1 つは、webview へのポインターを viewController のプロパティに格納することです。WebView のゲッターで、WebView がまだ存在しない場合は作成します。ボタン アクションは、Web ビューが既に存在する場合は再表示し、存在しない場合は Web ビューを作成するため、Web ビューを表示するだけで済みます。WebView を使い終わったら、nil に設定してください。

于 2012-06-12T09:38:47.030 に答える