Ios 关闭popover时禁用UIBarButtonim
我是iOS开发的新手,我尝试在点击BarbuttItem时显示popover。到目前为止,我有: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
-(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];
}