xcode 选择单元格后,如何关闭 UITableViewController 弹出窗口并更新 OtherViewController 上的插座?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11496005/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 00:54:20  来源:igfitidea点击:

How can I dismiss UITableViewController popover and update outlet on OtherViewController after selecting a cell?

objective-cxcodeuitableviewxcode4.3popover

提问by lemontwist

I currently have a popover that is a UITableViewController (called TableViewController) with 4 cells. Upon selecting one of the cells I would like to dismiss the popover and at the same time take a variable that is set based on the cell selection and use it as the text in a label outlet (i.e. self.styleText.text = thePopoverCellVariable;) in my other View Controller (called OtherViewController). How can I do this?

我目前有一个弹出窗口,它是一个TableViewController带有 4 个单元格的 UITableViewController(称为)。选择其中一个单元格后,我想关闭弹出窗口,同时采用基于单元格选择设置的变量,并将其用作self.styleText.text = thePopoverCellVariable;我的另一个视图控制器(称为OtherViewController)中标签出口(即)中的文本. 我怎样才能做到这一点?

Right now this only works if I dismiss the popover by clicking outside. The code in the TableViewController.mis:

现在,这仅在我通过单击外部关闭弹出窗口时才有效。中的代码TableViewController.m是:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ((OtherViewController *)self.presentingViewController).thePopoverCellVariable=theVariable;
}

And in OtherViewController.m:

并在OtherViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    UIStoryboardPopoverSegue *popoverSegue;
    popoverSegue = (UIStoryboardPopoverSegue *)segue;

    UIPopoverController *popoverController;
    popoverController = popoverSegue.popoverController;
    popoverController.delegate=self;
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    thePopoverCellVariable = ((StyleViewController *)popoverController.contentViewController).theVariable;
    self.styleText.text=thePopoverCellVariable;
}

采纳答案by lemontwist

I finallyfigured this out. @Jeffery Thomas has 99% of the correct answer. The other 1% is that you have to dismiss the popover from the root view controller, in this case OtherViewController. So I made popoverControllera variable in the header file and implemented my code as follows

终于想通了这一点。@Jeffery Thomas 有 99% 的正确答案。另外 1% 是您必须从根视图控制器中关闭弹出窗口,在这种情况下OtherViewController。所以我popoverController在头文件中做了一个变量并实现了我的代码如下

//OtherViewController.m
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    UIStoryboardPopoverSegue *popoverSegue;
    popoverSegue = (UIStoryboardPopoverSegue *)segue;
    popoverController = popoverSegue.popoverController;
    pCVisible = YES;
    [[segue destinationViewController] setDelegate:self];
}

- (void) setDataFromPopover {
    if (pCVisible) {
        [popoverController dismissPopoverAnimated:YES]; // THIS IS KEY! this is where the popover is dismissed, not in the popover itself
    }
}

And...

和...

//TableViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //variable = whatever

    OtherViewController *initialView;
    initialView=(OtherViewController *)self.delegate;
    initialView.theLabel.text = variable;
    [initialView setDataFromPopover];
}

回答by Jeffery Thomas

In TableViewController:

TableViewController

@property (weak, nonatomic) UIPopoverController *popoverController; // In header

@synthesize popoverController = _popoverController;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    self.theVariable = … // get the variable from the cell.

    [self.popoverController dismissPopoverAnimated:YES];
}

In OtherViewController:

OtherViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIStoryboardPopoverSegue *popoverSegue;
    popoverSegue = (UIStoryboardPopoverSegue *)segue;

? ? UIPopoverController *popoverController;
    popoverController = popoverSegue.popoverController;
? ? popoverController.delegate=self;

    TableViewController *tableViewController = (TableViewController *)popoverSegue.destinationViewController;
    tableViewController.popoverController = popoverController;
}


Sorry for the confusion earlier, I thought this would work like a modal view controller.

抱歉之前的混淆,我认为这会像模态视图控制器一样工作。



OK, I don't think this is optimal, but it should work.

好的,我认为这不是最佳选择,但它应该可以工作。



Update

更新

-popoverControllerDidDismissPopover:would not get called if you haven't set popoverController.delegate = selfin OtherViewController(see: delegate). This could be done in the storyboard or in -prepareForSegue:sender:

-popoverControllerDidDismissPopover:如果您尚未设置popoverController.delegate = self,则不会被调用OtherViewController(请参阅:delegate)。这可以在故事板或-prepareForSegue:sender: