Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.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/26.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 关闭popover时禁用UIBarButtonim_Ios_Objective C_Ipad - Fatal编程技术网

Ios 关闭popover时禁用UIBarButtonim

Ios 关闭popover时禁用UIBarButtonim,ios,objective-c,ipad,Ios,Objective C,Ipad,我是iOS开发的新手,我尝试在点击BarbuttItem时显示popover。到目前为止,我有: -(IBAction)shareButtonPressed :(id)sender{ UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil]; popoverViewControll

我是iOS开发的新手,我尝试在点击BarbuttItem时显示popover。到目前为止,我有:

-(IBAction)shareButtonPressed :(id)sender{    
    UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
    popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

    self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
    [self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
}
这段代码可以工作,当我点击正确的按钮时,弹出窗口就会显示出来。问题是当弹出窗口显示时,如果我再次点击按钮,应用程序就会崩溃。我知道是因为它试图分配一个已经创建的变量。我认为解决办法应该是禁用按钮时,弹出加载,但我不知道如何再次激活后,弹出被解除


我说得对吗?当弹出框被取消时,如何启用该按钮?

只需检查实例是否已创建

-(IBAction)shareButtonPressed:(id)sender
{
    if (self.popoverController == nil) {
        self.popoverController = alloc/init...;
        [_popoverController present...];
    } else {
        if (self.popoverController.popoverVisible)
            [self.popoverController dismissPopoverAnimated:YES];
        self.popoverController = nil;
    }
}
有一种可能性,它将在动画完成之前被垃圾收集,从而产生无效的用户体验。然后,如果可能的话,我会在viewDidLoad或Constructor等中预先创建实例,然后根据需要显示和关闭,检查visible属性。

查看此“事件-->责任”列表:

1) 按下按钮-->主视图控制器-iAction

2) 弹出窗口显示-->主视图控制器-iAction

3) 按钮禁用-->主视图控制器-iAction

4) Popover dissmis-->popoverDelegate-PopOvercontrollerdDismissPopover

5) 按钮启用-->popoverDelegate-PopOvercontrollerdDismissPopOver

因此,如果popover的代理是MainViewController,则可以访问按钮,如果它是另一个类,则可能必须设置协议才能启用按钮返回


如果您需要任何进一步的解释,请告诉我…

您可以检测到是否显示并取消了popover:

- (IBAction)shareButtonPressed :(id)sender{
    if (self.popoverController) {
        [self.popoverController dismissPopoverAnimated:YES];
        self.popoverController = nil;
    } else {
        UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
        popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

        self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
        [self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
    }
}
或者,如果您只想禁用该按钮:

- (IBAction)shareButtonPressed :(id)sender{
    ...
    UIButton *button = (UIButton *)sender;
    button.enabled = NO;
}

但在这种情况下,您必须检测用户何时关闭
popOver
以再次启用按钮。您可以在类中使用
uipopcovercontroller
delegate()这样修改您的代码

-(IBAction)shareButtonPressed :(id)sender{    
        UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
        popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

         if(self.popoverController)
          {
            [self.popovercontroller dismissPopoverAnimated:YES];
            self.popovercontroller = nil;
           }   
        self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
        [self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
    }

首先,您应该禁用shareButtonPressed方法中的按钮

-(IBAction)shareButtonPressed :(id)sender{    
UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
[self.myButton setEnabled:NO];
[self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
}
然后使视图控制器符合UIPopoverControllerDelegate协议。之后,实现PopOvercontrollerdDismissPopOver方法

-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
if (!self.myButton.enabled) // Just to make sure the button is disabled.
    [self.myButton setEnabled:YES];

}