9

与此问题类似,但我正在寻找通用解决方案或设计模式或框架。

问:如何在我的 iOS 应用程序中自动将状态管理添加到所有 UI 控件中,而无需重写现有控件的类?

例子:

例如,当我点击 aUIButton时,它将创建一个新的UIWebView显示 Google 主页。这很容易,但是当用户有时会出现问题..单击按钮太快,因此将显示两个 webview。

为了解决这个问题,我需要创建一个包含 webview 的单例类,并且有一个状态变量isOpended,如果它是真的,重用现有的 webview 而不是创建一个新的。

但问题是:如果我希望在其他控件中也有这种行为,那么我需要创建许多单例类。我只是在想是否有更好的方法来处理这个问题,而无需重新发明轮子。

谢谢。

4

4 回答 4

9

我认为你在这里解决了错误的问题。为什么不禁用按钮,直到 UIWebView 完成处理。这样用户就不能单击它两次。

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

您误解了解决问题的最佳方法。首先,您永远不应该发现自己处于创建许多单例的情况。单例是一种必要的邪恶,但你不应该过度使用或滥用它们。这是一篇关于objective-c中单例的好文章。

当用户单击您的按钮时,您可以采取多种方法来防止显示第二个 UIWebView。

正如其他人所说,一种解决方案是禁用该按钮,以便用户无法“双击”它。你这样做使用:

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

我同意其他答案,如果您不希望它被激活两次,您可能应该禁用该控件。但是,如果您确实想要回答有关可以在所有控件上使用的通用模式的实际问题,那么您可以使用关联对象...

- (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实例,如果它已经存在,它们都共享同一个webView对象),那么您可以将 关联webView[UIButton class]对象甚至[UIControl class]对象而不是您的特定实例。您可以通过替换上面代码中的senderwith来做到这一点。[UIControl class]

于 2012-06-07T20:01:22.587 回答
3

一种可能的解决方案是将指向 webview 的指针存储在 viewController 的属性中。在 webview 的 getter 中,如果 webview 尚不存在,则创建它。按钮操作只需要显示 webview,因为如果 webview 已经存在,它将重新显示 webview,如果不存在,它将创建 webview。完成 webview 后,只需将其设置为 nil。

于 2012-06-12T09:38:47.030 回答