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
How can I dismiss UITableViewController popover and update outlet on OtherViewController after selecting a cell?
提问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.m
is:
现在,这仅在我通过单击外部关闭弹出窗口时才有效。中的代码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 popoverController
a 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 = self
in OtherViewController
(see: delegate). This could be done in the storyboard or in -prepareForSegue:sender:
-popoverControllerDidDismissPopover:
如果您尚未设置popoverController.delegate = self
,则不会被调用OtherViewController
(请参阅:delegate)。这可以在故事板或-prepareForSegue:sender: