如何在iOS中触发从一个视图控制器到另一个视图控制器的操作

时间:2013-02-01 12:12:39

标签: iphone ios objective-c uiviewcontroller

如何更改另一个视图控制器中的UILabel属性?

我在FirstViewController.m文件中导入#import "SecondViewController.h",然后

我在FirstViewController

中的方法中有以下内容
-(IBAction) someAction {

    SecondViewController *objV1 = [[SecondViewController alloc]init];

    objV1.secondViewControllerLabel.alpha = 0.2;

NSLog(@"someAction");

}

当调用someAction时,SecondViewController中的UILabel没有任何反应。

此外,在此示例中,第一个和第二个视图控制器都位于另一个名为MainViewController的视图控制器中。所以,他们同时在屏幕上。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

根据您的描述,您似乎需要将“嵌入式视图控制器”设置为父视图控制器的子级。

[mainViewController addChildViewController:childViewController];
[childViewController.view setFrame:self.view.bounds];
[self.childContainerView addSubview:childViewController.view];
[childViewController didMoveToParentViewController:self];

这非常强大,因为您可以将mainViewController的IBAction转发给他们的孩子......

[mainViewController childViewControllers]

返回它们的数组,并查看

– shouldAutomaticallyForwardRotationMethods
– shouldAutomaticallyForwardAppearanceMethods

因此,您的孩子会自动获知其父母的轮换情况。

要回答您的问题,您可以执行以下操作:

// In Parent View Controller
- (IBAction) anAction:(id) sender
{
    for (CustomChildController *child in self.viewControllers) {
        [child handleSomeAction];
    }
}

查看docs所说的内容以获取更多详情。

答案 1 :(得分:1)

@Goles的答案会有效,但如果您特别想从FirstViewController.m触发更改,则需要以某种方式传递对SecondViewController的引用。

所以你可以使用一个自定义init来实现它,它将第二个viewcontroller作为参数引用,或者在你可以从外面设置的FirstViewController上创建一个属性,如下所示:

FirstController.h:

@interface
..
@property (strong, nonatomic) UIViewController *second;
...
@end

FirstController.m:

@implementation
@synthesize second 

在您的父ViewController中,您将创建两个子视图控制器,然后:

ViewController1.second = ViewController2;

然后你的行动方法将成为:

-(IBAction) someAction {
    self second.secondViewControllerLabel.alpha = 0.2;
NSLog(@"someAction");
}

答案 2 :(得分:0)

由于在secondViewController中尚未创建secondViewControllerLabel,因此'objV1.secondViewControllerLabel.alpha'将不起作用。理想情况下,您应该在secondViewController中创建名为labelAlpha的NSNumber属性,在firstViewController中设置该属性,然后在第二个控制器的viewDidLoad中添加以下行::

self.secondViewControllerLabel.alpha = self.labelAlpha;

这对你有用。