Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 防止动作两次触发的更有效方法是什么?_Ios_Objective C - Fatal编程技术网

Ios 防止动作两次触发的更有效方法是什么?

Ios 防止动作两次触发的更有效方法是什么?,ios,objective-c,Ios,Objective C,我遇到了一个问题,当有人点击导航栏上的右按钮并再次快速点击时,程序崩溃了。这是可以理解的,因为新视图尚未完成加载,并且按钮仍然可以再次点击,因此它将尝试再次按下视图以使程序崩溃。我已经尝试了几种方法来防止这种情况的发生,我目前的实现在某种程度上是有效的,但我知道有更好的解决方案,也许是框架中内置的解决方案 - (void) loadView { [super loadView]; self.navigationItem.rightBarButtonItem = [[[UIBar

我遇到了一个问题,当有人点击导航栏上的右按钮并再次快速点击时,程序崩溃了。这是可以理解的,因为新视图尚未完成加载,并且按钮仍然可以再次点击,因此它将尝试再次按下视图以使程序崩溃。我已经尝试了几种方法来防止这种情况的发生,我目前的实现在某种程度上是有效的,但我知道有更好的解决方案,也许是框架中内置的解决方案

- (void) loadView
{
    [super loadView];

    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]
                                               initWithTitle:@"Members" 
                                               style:UIBarButtonItemStylePlain 
                                               target:self 
                                               action:@selector(showRoster)] autorelease];
}


-(void) showRoster {
    if (seconds + 3 < [[NSDate date] timeIntervalSince1970]) { //This is where I am trying to prevent the button from being activated twice.
        seconds = [[NSDate date] timeIntervalSince1970];

        vcRoster = [[RosterDataViewController alloc] init];
        vcRoster.rosterDataModel.group_id = self.tweetsByGroupIdModel.group_id;
        [self.navigationController pushViewController:vcRoster animated:YES];
    }

我试着解决这个问题,用谷歌搜索我的答案,但我还没有找到一个解决这个问题的好办法。我知道以上不是一个很好的方法,我愿意接受任何改进的建议,因为我对IOS世界非常陌生。提前感谢您的帮助。

一旦操作方法运行,请尝试禁用该按钮:

-(void) showRoster:(UIButton*)sender {
  sender.enabled = NO;
  ...
}

您可以稍后启用它,使其再次响应。如何最好地实现这一点取决于所显示的视图:如果它是全屏的,您可以简单地重新启用
视图中的按钮显示:
(即,在视图消失后,您的按钮再次可见)。

一旦运行操作方法,请尝试禁用按钮:

-(void) showRoster:(UIButton*)sender {
  sender.enabled = NO;
  ...
}

您可以稍后启用它,使其再次响应。如何最好地实现这一点取决于所显示的视图:如果是全屏视图,您只需重新启用
视图中的按钮即可出现:
(即,在视图消失且按钮再次可见后)。

您应该使用UIViewController的isViewLoaded方法检查视图是否已加载:

if (self.navigationController.topViewController.isViewLoaded && seconds + 3 < [[NSDate date] timeIntervalSince1970]) {...} 
if(self.navigationController.topViewController.isViewLoaded&&seconds+3<[[NSDate-date]timeIntervalSince1970]){…}

您应该使用UIViewController的isViewLoaded方法检查视图是否已加载:

if (self.navigationController.topViewController.isViewLoaded && seconds + 3 < [[NSDate date] timeIntervalSince1970]) {...} 
if(self.navigationController.topViewController.isViewLoaded&&seconds+3<[[NSDate-date]timeIntervalSince1970]){…}

我假设我需要通过选择器传递一些信息,因为当我使用您的代码时,我会遇到此错误-[TweetsByGroupIdViewController showRoster]:发送到实例0x3b5d20的无法识别的选择器是否在该控制器上使用该方法?它是一个UIControl,它是在控制器上,我相信,在我发布的代码中,它是一个UIBarButton。在我的代码中尝试时,我考虑到了这一点。但是,似乎没有看到sender参数,因为我假设该参数没有被传递。既然您将sender参数添加到此方法中,我是否需要更改loadView中的操作选择器以某种方式表示它?哇,这太傻了,这整件事让我意识到按钮后面的导航栏才是真正的罪魁祸首,导航栏上有一个双击,这实际上是导致崩溃的原因。但是,您的代码确实可以正确地禁用按钮,因此这是正确的答案。谢谢你的帮助!我假设我需要通过选择器传递一些信息,因为当我使用您的代码时,我得到了这个错误-[TweetsByGroupIdViewController showRoster]:发送到实例0x3b5d20的无法识别的选择器是否在该控制器上使用该方法?这是一个UIControl调用它吗?是的,它在那个控制器上,我相信正如我发布的代码一样,它是一个uibarbuttoneim。在我的代码中尝试时,我考虑到了这一点。但是,似乎没有看到sender参数,因为我假设该参数没有被传递。既然您将sender参数添加到此方法中,我是否需要更改loadView中的操作选择器以某种方式表示它?哇,这太傻了,这整件事让我意识到按钮后面的导航栏才是真正的罪魁祸首,导航栏上有一个双击,这实际上是导致崩溃的原因。但是,您的代码确实可以正确地禁用按钮,因此这是正确的答案。谢谢你的帮助!我尝试了您发布的代码的几种变体,但没有一种变体阻止操作尝试两次推出视图控制器。我尝试了您发布的代码的几种变体,但没有一种变体阻止操作尝试两次推出视图控制器。