【问题标题】:How to prevent segue transfer of control to another UIView when UIPopover is displayed from UITableView?从 UITableView 显示 UIPopover 时,如何防止将控制权转移到另一个 UIView?
【发布时间】:2014-05-13 20:45:03
【问题描述】:

我有一个 iPad 应用程序(XCode 5.1.1、iOS 7.1、ARC 和 Storyboards)。我有一个UITableView 调用其他UIViewsUITableViews。 (oServicesCell 如下图所示)

通常,当用户点击“服务”行时,我会显示另一个 UITableView 的数据。但是,有时我需要显示UIPopover 而不是`UITableView。

这是我正在使用的代码,它可以工作,但是当显示正常的UITableViewanchor 会消失(还显示了UIPopover...我之前可以看到它当弹出窗口仍然可见时,应用程序崩溃并达到 -[UIPopoverController dealloc]。)。

#pragma mark prepareForSegue
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

if ([segue.identifier isEqualToString:@"segueStartTime"]) {
    DateTime *dt = (DateTime *)segue.destinationViewController;
dt.whichTextField = @"oStartTime";
}
else if ([segue.identifier isEqualToString:@"segueEndTime"]) {
    DateTime *dt = (DateTime *)segue.destinationViewController;
    dt.whichTextField = @"oFinishTime";
}
else if ([segue.identifier isEqualToString:@"segueFromServices"]) {

    SingletonServicesType *sharedInstance = [SingletonServicesType sharedServicesType];

    //  initialize
    UIViewController* popoverContent = [[UIViewController alloc] init];
    UIView *popoverView;
    SZTextView *activityField;
    UIPopoverController *popoverController;

    if([sharedInstance.globalServicesType  isEqual: @3])  {  //  "manual entry"?
        popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 250, 150)];  //  was 216
        popoverContent.preferredContentSize = CGSizeMake(250.0, 150.0);

        activityField = [[SZTextView alloc] init];
        activityField.frame =  CGRectMake(0, 0, 250, 150);

        activityField.placeholder = NSLocalizedString(@"Enter your activity for this appointment only",nil);
        [activityField becomeFirstResponder];

        //  add it to the popover
        popoverContent.title = NSLocalizedString(@"manual",nil);
        [popoverView addSubview:activityField];
        popoverContent.view = popoverView;


        //  if previous popoverController is still visible... dismiss it
        if ([popoverController isPopoverVisible]) {
            [popoverController dismissPopoverAnimated:YES];
        }

        popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
        popoverController.delegate = (id)self;

        [popoverController setPopoverContentSize:CGSizeMake(250, 150) animated:NO];

        //  show it
        [popoverController presentPopoverFromRect: oServicesCell.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];

    }
}
}

如何防止UITableView 的控制权转移?我要做的就是显示UIPopover

【问题讨论】:

    标签: objective-c uitableview uiview ios7.1 uipopover


    【解决方案1】:

    -[UIPopoverController dealloc] 在 popover 仍然可见时到达。

    此错误意味着您需要在弹出框控制器的整个显示过程中的某个地方有一个强指针。

    在上面的代码中,您有一个弹出框控制器的局部变量,该变量将在方法结束时被释放。相反,在上面的任何类上都有一个属性,它将在需要时保持弹出框 - 您可以在弹出框委托方法中将属性设置为 nil,当它关闭时。

    您的另一个问题是情节提要的限制-您无法将同一事物的两个不同的segue(单元格选择)链接起来。最简单的方法可能是在视图控制器上实现- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender - 如果要显示表格,则返回YES,否则,显示弹出框。当它到达prepareForSegue 时为时已晚 - 您将显示弹出框 执行 segue。

    【讨论】:

    • 谢谢...你的建议有效,但我不喜欢结果(原来的 UITableView 仍然可见,这让它看起来很乱。)所以,我要尝试别的.再次感谢,感谢您的宝贵时间。
    • 哦,我以为你的意思是在表格视图上弹出一个弹出框。否则popover会从哪里来?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多