popoverPresentationController从iPhone

时间:2016-03-05 14:40:53

标签: ios objective-c uitableview uiviewcontroller

我在UIViewController内显示UITableViewController来自iPhone的弹出式演示文稿时出现问题。我一直使用的代码用于显示来自任何其他UIViewController的弹出窗口,而不是iPhone上的UITableViewController。它可以在iPad上的UITableViewController上运行。

执行代码时,视图会以模态方式临时显示(如果我没有实现adaptivePresentationStyleForPresentationController),然后用黑色覆盖,就像发生某种自动布局错误一样(尽管有&# 39;在控制台中没有任何内容表示其他情况。)

正如我所提到的,以下内容适用于iPhone上的UITableViewController以外,并且一直在iPad上运行。我确定我错过了一些相当简单的东西。有什么想法吗?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    /* Create label */
    UILabel *label = [UILabel new];
    label.text = @"This should be in a popover.";
    label.numberOfLines = 0;
    label.lineBreakMode = NSLineBreakByWordWrapping;

    /* Add label to new ViewController */
    UIViewController *popoverVC = [UIViewController new];
    [popoverVC.view addSubview:label];
    label.translatesAutoresizingMaskIntoConstraints = NO;
    [popoverVC.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)]];
    [popoverVC.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)]];

    /* Define ViewController to present as a popover and display */
    popoverVC.modalPresentationStyle = UIModalPresentationPopover;
    popoverVC.preferredContentSize = CGSizeMake(320, 50);
    [self presentViewController:popoverVC animated:YES completion:nil];

    /* Grab handle to ViewController's popoverPresentationController after displaying */
    UIPopoverPresentationController *popoverController = [popoverVC popoverPresentationController];
    if (popoverController == nil)
        NSLog(@"popoverController is nil");
    else {
        popoverController.delegate = self;
        popoverController.popoverLayoutMargins = UIEdgeInsetsMake(15, 15, 15, 15);
        popoverController.sourceView = tableView;
        popoverController.sourceRect = [tableView rectForRowAtIndexPath:indexPath];

        self.definesPresentationContext = YES;
    }
}

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
    return (UIModalPresentationNone);
}

FWIW:快速建立此代码原型的一种方法是将上述内容添加到{" Master-Detail Application" Xcode中的模板,并定义此消息以避免推送MasterViewController.m

DetailViewController

您还需要设置- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender { return (NO); } 以采用MasterViewController.h协议。

1 个答案:

答案 0 :(得分:1)

黑色的原因很简单。

您的控制器是透明的(您没有为其func +(left: CGPoint, right: CGVector) -> CGPoint { return CGPoint(x: left.x+right.dx, y: left.y+right.dy) } 设置任何背景颜色)。演示动画使其显示在表格视图上,但一旦动画结束,下面的视图将从层次结构中删除,最终会出现窗口背景颜色(默认为黑色)和带有黑色标签的透明控制器。

view

您将看到控制器正常运行。

我不确定为什么你的控制器没有显示为弹出窗口,因为你根据文档正确地做了一切。但是,移动

popoverVC.view.backgroundColor = [UIColor yellowColor];

成为该方法的最后一行解决了问题。注意:根据文档,这甚至不起作用。