1

我目前正在开发一个需要使用多种服务“共享”选项的应用程序;例如电子邮件、推特。

为此,我有一个UIBarButtonItem编码,当被触摸时,它会触发:

UIActionSheet *sheet = [[UIActionSheet alloc] 
                            initWithTitle:@""
                            delegate:self
                            cancelButtonTitle:nil
                            destructiveButtonTitle:nil
                            otherButtonTitles:nil];

    [sheet addButtonWithTitle:@"Email"];
    [sheet addButtonWithTitle:@"Tweet"];
    [sheet addButtonWithTitle:@"Cancel"];

    sheet.cancelButtonIndex = sheet.numberOfButtons-1;

    [sheet showFromRect:self.view.bounds inView:self.view animated:YES];
    [sheet release];

结合此来检测选择了哪个按钮:

clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == actionSheet.cancelButtonIndex) { return; }
    switch (buttonIndex) {
        case 0:
        {

            [self emailThis];
            break;
        }
        case 1:
        {
            [self tweetThis];
            break;
        }
    }

这在 iPhone 上是一种享受。但不幸的是,它在 iPad 上显示不正确。看起来它正在尝试显示UIPopoverController,但它位于导航栏的中心,几乎没有高度。

我已经研究过使用 UIPopoverController,但我似乎无法找到如何将它与按钮一起使用。无论如何我可以调整上面的代码以正确显示按钮,因为它已经尝试过。

非常感谢,

瑞安

PS:我是 Objective-c/iOS 编码的新手,所以请具体说明。谢谢 :)

编辑: 我尝试过使用:

[sheet showFromBarButtonItem:[self share] animated:YES];

但它不起作用。这是我的按钮代码:

UIBarButtonItem *share = [[UIBarButtonItem alloc] 
                                initWithTitle:@"Share"                                            
                                style:UIBarButtonItemStyleBordered 
                                target:self 
                                action:@selector(loadShare)];
    self.navigationItem.rightBarButtonItem = share;
    [share release];

这里也是 .h 文件中的代码:

@interface DetailViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
UIBarButtonItem *share;
}

@property (nonatomic, retain) IBOutlet UIBarButtonItem *share;

这是调试错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“ * -[__NSPlaceholderArray initWithObjects:count:]:尝试从对象 [0] 插入 nil 对象”

4

3 回答 3

7
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(actionPhotoShare:)] autorelease];

...

-(void)actionPhotoShare:(id)sender
{
actionSheetShare = [[UIActionSheet alloc] initWithTitle:nil 
                                                              delegate:self 
                                                     cancelButtonTitle:nil
                                                destructiveButtonTitle:NSLocalizedString(@"ActionSheet_Cancel", @"")
                                                     otherButtonTitles:NSLocalizedString(@"ActionSheet_Email", @""),nil];

if (IS_DEVICE_IPAD) {
    [actionSheetShare showFromBarButtonItem:sender animated:YES];
}else {
    [actionSheetShare showInView:self.view];
}
}
于 2012-06-10T07:13:03.083 回答
0

代替 [sheet showFromRect],使用 [sheet showFromBarButtonItem],并将其指向您的 Share UIBarButtonItem。注意:如果您还没有,您可能需要为您的 UIBarButtonItem 创建一个 IBOutlet 或 ivar,但这非常简单,我猜您可以这样做。

于 2012-06-09T22:39:55.827 回答
0

您的问题是您使用showFromRect的 rect 是整个屏幕。这意味着弹出窗口将“箭头”放置在屏幕中心的最佳位置。您想要的是showFromBarButtonItem或者传入按钮的 rect ( self.shareButtonItem.frame)。

于 2012-06-09T22:40:53.840 回答