Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从子视图更新父视图_Ios_Objective C - Fatal编程技术网

Ios 从子视图更新父视图

Ios 从子视图更新父视图,ios,objective-c,Ios,Objective C,我使用的是Xcode 5(iOS SDK 7.0)。我正在尝试从子视图更新父视图中的元素 我有以下文件: ViewOneController ViewTwoController [self.delegate somethingHappenedInViewTwoController]; 在ViewOneController中,我将ViewTwoController添加为子视图,代码如下: [self.view addSubview:ViewTwoController]; 我在ViewOneCo

我使用的是Xcode 5(iOS SDK 7.0)。我正在尝试从子视图更新父视图中的元素

我有以下文件: ViewOneController ViewTwoController

[self.delegate somethingHappenedInViewTwoController];
在ViewOneController中,我将ViewTwoController添加为子视图,代码如下:

[self.view addSubview:ViewTwoController];
我在ViewOneController.h中定义了UIImageView

IBOutlet UIImageView *box;
@protocol ViewTwoDelegate <NSObject>
    - (void)somethingHappenedInViewTwoController;
@end

@interface ViewTwoController : UIViewController 
....
@property (nonatomic,weak) id<ViewTwoDelegate> delegate;
我想从ViewTwoController更新框的背景颜色。我知道我可以用下面的代码更新背景色

[box setBackgroundColor:[UIColor redColor]];

但这仅适用于ViewOneController。我有一个名为updateColor的函数是ViewTwoController。我想通过该函数更新框的颜色。

一种快速且不太干净的方法是直接调用您的parentviewcontroller:

[((ViewOneController*)self.parentViewController).box setBackgroundColor:[UIColor redColor]];
然而就像Larme建议的那样,我相信最干净的方法是使用委托,它用于在用户做了某件事之后通知更改。这里有一个教程

您必须在ViewTwoController.h中创建代理协议

IBOutlet UIImageView *box;
@protocol ViewTwoDelegate <NSObject>
    - (void)somethingHappenedInViewTwoController;
@end

@interface ViewTwoController : UIViewController 
....
@property (nonatomic,weak) id<ViewTwoDelegate> delegate;
您可以在下面添加以下方法

- (void)somethingHappenedInViewTwoController{
    [box setBackgroundColor:[UIColor redColor]];
}
然后在ViewTwoController.m中调用此方法,它将调用在ViewOneController中实现的方法

[self.delegate somethingHappenedInViewTwoController];

你可以使用委托方法。我忘了说,我对iOS应用程序开发完全是新手,所以请举一个例子来参考一个例子。你的命名约定有点混乱。UIView子类通常不包括控制器作为名称的一部分。也许最好的方法是按照Justafinger的解决方案。除此之外,鉴于viewTwoController是UIView子类,viewTwoController中的@interface声明将如下所示:;“@interface ViewTwoController:UIView”(减去引号-因此在使用“@”时会抱怨通知)我还没有尝试过代理。第一个不起作用。给出了以下错误:“在“ViewTwoController*”类型的对象上找不到属性“parentViewController”。如果ViewTwoController是UIView(顺便说一下,这是一个非常糟糕的名称),则必须使用委托