我有两个视图,每个视图都有自己的视图控制器。第一个视图有两个按钮(“Button”和“Button2”)。当我点击“按钮”时,我加载第二个视图控制器,其中包含UIPickerView
,它悬停在第一个视图上(通过执行addSubview
),如下图所示)。当我点击第二个视图的“项目”按钮时,我使用UIPickerView
隐藏视图。当我点击“项目”按钮时,我不仅想要使用UIPickerView
隐藏视图,还要设置从UIPickerView
中选择项目的按钮名称。
(这两个视图中的每一个都有自己的视图控制器。)
答案 0 :(得分:2)
流程如下:
定义子视图控制器的协议以通知父视图控制器:
//
// ChildViewDelegate.h
//
#import <Foundation/Foundation.h>
@protocol ChildViewDelegate <NSObject>
- (void)didUpdateValueX:(NSString *)string;
@end
显然,请使用更有意义的名称替换didUpdateValueX
。
定义父视图控制器以符合该协议:
//
// ViewController.h
//
#import <UIKit/UIKit.h>
#import "ChildViewDelegate.h"
@interface ViewController : UIViewController <ChildViewDelegate>
// the rest of your interface here
@end
确保父控制器实现该协议的方法:
- (void)didUpdateValueX:(NSString *)string
{
// do whatever you want with it
}
当父级添加子级时,请务必调用必要的自定义容器调用,尤其是addChildViewController
和didMoveToParentViewController
:
UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"child"];
[self addChildViewController:controller];
controller.view.frame = ...;
[self.view addSubview:controller.view];
[controller didMoveToParentViewController:self];
当孩子准备好通知家长并解雇自己时,它会执行以下操作:
if ([self.parentViewController conformsToProtocol:@protocol(ChildViewDelegate)])
{
[(id<ChildViewDelegate>)self.parentViewController didUpdateValueX:someStringValue];
[self willMoveToParentViewController:nil];
[self.view removeFromSuperview];
[self removeFromParentViewController];
}
else
{
NSLog(@"%s: %@ does not conform to ChildViewDelegate!!!", __FUNCTION__, self.parentViewController);
}
这会调用协议方法,然后自行删除(调用必要的包含方法willMoveToParentViewController:nil
和removeFromParentViewController
)。
从理论上说,你可以简化这个(保留所有的遏制的东西,但抛弃协议),如果你的父母有一类属性,而孩子在理论上可以直接引用,但最好的做法是使用协议,因此孩子控制器对他们的父控制者更加不了解。
请参阅Creating Custom Container View Controllers在视图控制器编程指南。的对于为什么它摆在首位使用这些容器调用,看WWDC 2011的视频是很重要的讨论Implementing UIViewController Containment
答案 1 :(得分:0)
您可以使用...
从UIPickerView
访问SELECTED值
- (NSInteger)selectedRowInComponent:(NSInteger)component
下面我将介绍如何从UIPickerView
获取所选值的基本步骤。
NSInteger selctedRow;
selctedRow = [myPickerView selectedRowInComponent:0];
NSString *strValue = [myArrayOfPickerView objectAtIndex:selctedRow];
[myButtonName setTitle:strValue forState:UIControlStateNormal];
或强>
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSString *strValue = [myArrayOfPickerView objectAtIndex:Row];
[myButtonName setTitle:strValue forState:UIControlStateNormal];
}