从popOverView访问viewController数据

时间:2013-05-30 08:07:04

标签: ios objective-c xcode ipad uiviewcontroller

所以假设我有一个viewController视图和一个弹出UITableView表。

我希望能够通过从表中选择一个选项来更改调用弹出表的viewController的背景视图。

所以我想做的是以下内容:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{


    int selectedEntry = indexPath.row;
    switch(selectedEntry){
        case 1:
          //CODE TO CHANGE ORIGINAL VIEW TO IMAGE 1
        case 2:
          //CODE TO CHANGE ORIGINAL VIEW TO IMAGE 2
        //etc
   }
}

我已经知道如果我直接在基本视图类中编写方法,我可以写

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"IMAGE"]];

但是因为它是从弹出菜单中调用的,所以我不知道如何访问它。

4 个答案:

答案 0 :(得分:0)

解决方案可能是在UIViewController子类中为UITableView添加属性,以便您可以保留对它的引用,然后再访问它:

@property (nonatomic, weak) MyViewController *parentVC;

MyViewController是您的UIViewController子类)

当您从UITableView初始化UIViewController时,请将其parentVC属性设置为self。然后在didSelectRowAtIndexPath:中,使用:

parentVC.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"IMAGE"]];

答案 1 :(得分:0)

当您单击弹出控制器中的按钮时,您可以使用委托来监听按钮操作并在视图控制器中执行此操作。或者,您可以使用NSNotification在按钮单击期间发布通知,并在视图控制器中收听通知。

在按钮操作

中写下此内容
[[NSNotificationCenter defaultCenter] postNotificationName:UIButtonOneClickedNotification object:nil];

在视图控制器didLoad方法中写这个

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(buttonOneClicked:) name:UIButtonOneClickedNotification object:nil];

并在方法buttonOneClicked中执行您需要做的事情:

答案 2 :(得分:0)

您可以使用NSNotificationCenter

添加以下行。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    int selectedEntry = indexPath.row;
    switch(selectedEntry){
        case 1:
          [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeBackground" object:self userInfo:yourData1];
        case 2:
          [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeBackground" object:self userInfo:yourData2];
        //etc
   }
}

将此添加到您要更改背景的BaseViewController

- (void)viewDidLoad {

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeBackgroundView:) name:@"ChangeBackground" object:nil];

}

- (void)changeBackgroundView:(NSNotification *)yourData {

    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"IMAGE"]];

}

答案 3 :(得分:0)

通过使用协议你可以这样做 像AVC(aViewController)显示BVC(bviewcontroller)作为popover那么你需要做的是如下 在BVC.h

@protocol TablePopoverDelegate <NSObject>
-(void)doSomeWork;
@end
@property (nonatomic, weak) id<TablePopoverDelegate> delegate;

并且在BVC.m中你需要做的是

- (IBAction)buttoonpressd:(id)sender {
    [self.delegate doSomeWork];
}

并且在AVC.h中你需要添加这个协议:“TablePopoverDelegate”

然后在AVC.m中你需要实现所需的功能 并设置委托 如下所示

从你出现popover的地方做这些东西

这里“按钮”是发送者,按下它你将显示popover

__weak UIViewController *selfView = self;

UIViewController *nextViewController;
UIViewController *infoViewController = [[UIViewController alloc] init];
            infoViewController.delegate = self;
            nextViewController = infoViewController;


_popOverController = [[UIPopoverController alloc] initWithContentViewController:nextViewController];
        [self.popOverController setDelegate:self];
        __weak UIPopoverController *blockPopoverController = self.popOverController;

        self.popoverControllerPresentationBlock = ^(void){
            [blockPopoverController presentPopoverFromRect:[button convertRect:button.bounds toView:selfView.view]
                                                    inView:selfView.view
                                  permittedArrowDirections:UIPopoverArrowDirectionUp
                                                  animated:YES];
        };
        // invoke the presentation block to show the popover now
        self.popoverControllerPresentationBlock();

以下是代理人正在调用的功能

-(void)doSomeWork
{
    //do your stuff here
}