首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在iPad上为UIActionSheet访问UIPopoverController

在iPad上为UIActionSheet访问UIPopoverController
EN

Stack Overflow用户
提问于 2010-05-11 06:51:28
回答 7查看 21.6K关注 0票数 16

在iPad上,用户可以使用-showFromBarButtonItem:animated:显示UIActionSheet。这很方便,因为它在操作表周围包装了一个UIPopoverController,并将弹出窗口的箭头指向传入的UIBarButtonItem。

但是,此调用会将UIBarButtomItem的工具栏添加到直通视图列表中-这并不总是令人满意的。而且,如果没有指向UIPopoverController的指针,就无法将其他视图添加到直通列表中。

有没有人知道一种获得批准的方法来获取popover控制器的指针?

提前谢谢。

EN

回答 7

Stack Overflow用户

发布于 2010-05-12 19:23:04

您需要在方向更改时进行调整。

我找到了另一种解决方案,它对我来说非常有效。

坚持

代码语言:javascript
复制
- (void)showFromBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated

在您的@接口中添加

代码语言:javascript
复制
UIActionSheet *popoverActionsheet;

还可以添加

代码语言:javascript
复制
@property (nonatomic, retain) UIActionSheet *popoverActionsheet;

还可以添加

代码语言:javascript
复制
- (IBAction)barButtonItemAction:(id)sender;

因此,您可以从实现中任何位置引用您的操作表。

在您的实现中

代码语言:javascript
复制
- (IBAction) barButtonItemAction:(id)sender
{
    //If the actionsheet is visible it is dismissed, if it not visible a new one is created.
    if ([popoverActionsheet isVisible]) {
        [popoverActionsheet dismissWithClickedButtonIndex:[popoverActionsheet cancelButtonIndex] 
                                                     animated:YES];
        return;
    }

    popoverActionsheet = [[UIActionSheet alloc] initWithTitle:nil
                                                     delegate:self
                                            cancelButtonTitle:nil 
                                       destructiveButtonTitle:nil
                         otherButtonTitles:@"Save Page", @"View in Safari", nil];

    [popoverActionsheet showFromBarButtonItem:sender animated:YES];
}

在actionsheet委托实现中

代码语言:javascript
复制
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{

    if (buttonIndex == [actionSheet cancelButtonIndex]) return;

    //add rest of the code for other button indeces
}

别忘了在

代码语言:javascript
复制
- (void)dealloc

我相信这会行得通。

票数 10
EN

Stack Overflow用户

发布于 2011-05-04 19:40:17

代码语言:javascript
复制
    if ([[[[actionSheet superview] superview] nextResponder] respondsToSelector:@selector(setPassthroughViews:)]) {
        [[[[actionSheet superview] superview] nextResponder] performSelector:@selector(setPassthroughViews:) withObject:nil];
    }

这应该不会对应用程序审查者造成任何问题,因为它不会调用任何私有App。

它是脆弱的- if语句确保你的代码不会在苹果改变底层实现的情况下崩溃(只是不工作)。

票数 9
EN

Stack Overflow用户

发布于 2010-05-13 17:29:35

我怀疑是否有批准的方法来解决这个问题,因为操作单是用UIPopoverViews呈现的,它链接到UIViewController,而不是UIPopoverController

代码语言:javascript
复制
NSLog(@"%@",[[[popoverActionsheet superview] superview] passthroughViews]);

查看UIPopoverView头文件(未记录)会产生以下解决方案,尽管没有记录。如果你觉得值得一试的话,我想你可以跳过应用评审员的审核。

http://github.com/kennytm/iphone-private-frameworks/blob/master/UIKit/UIPopoverView.h

代码语言:javascript
复制
NSArray *passthroughViews = [[[popoverActionsheet superview] superview] passthroughViews];

        NSMutableArray *views = [passthroughViews mutableCopy];
        [views addObject:[self view]];
        [[[popoverActionsheet superview] superview] setPassthroughViews:views];
        [views release];
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2806988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档