1

我有两个视图,每个视图都有自己的视图控制器。第一个视图有两个按钮(“Button”和“Button2”)。当我单击“按钮”时,我加载了第二个视图控制器,其中包含一个UIPickerView,它悬停在第一个视图上(通过执行addSubview),如下图所示)。当我单击第二个视图的“项目”按钮时,我用UIPickerView. 当我点击“项目”按钮时,我不仅想用 隐藏视图,UIPickerView还想用从 中选择的项目设置按钮的名称UIPickerView

(这两个视图中的每一个都有自己的视图控制器。)

屏幕快照

4

2 回答 2

2

过程如下:

  1. 为子视图控制器定义一个协议以通知父视图控制器:

    //
    //  ChildViewDelegate.h
    //
    
    #import <Foundation/Foundation.h>
    
    @protocol ChildViewDelegate <NSObject>
    
    - (void)didUpdateValueX:(NSString *)string;
    
    @end
    

    显然,替换didUpdateValueX为更有意义的名称。

  2. 定义父视图控制器以符合该协议:

    //
    //  ViewController.h
    //
    
    #import <UIKit/UIKit.h>
    #import "ChildViewDelegate.h"
    
    @interface ViewController : UIViewController <ChildViewDelegate>
    
    // the rest of your interface here
    
    @end
    
  3. 确保父控制器实现该协议中的方法:

    - (void)didUpdateValueX:(NSString *)string
    {
        // do whatever you want with it
    }
    
  4. 当父级添加子级时,请确保调用必要的自定义容器调用,特别是addChildViewControllerdidMoveToParentViewController

    UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"child"];
    [self addChildViewController:controller];
    controller.view.frame = ...;
    [self.view addSubview:controller.view];
    [controller didMoveToParentViewController:self];
    
  5. 当孩子准备好通知父母并解雇自己时,它会执行以下操作:

    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:nilremoveFromParentViewController)。

从理论上讲,如果您的父级具有类属性,并且子级理论上可以直接引用它,您可以简化这一点(保留所有包含内容,但放弃协议),但最佳实践是使用协议,因此子控制器有点对他们的父控制器更加不可知论。

请参阅View Controller Programming Guide中的创建自定义容器视图控制器。有关为什么首先使用这些容器调用很重要的讨论,请参阅 WWDC 2011 视频实施 UIViewController Containment

于 2013-06-28T15:23:26.963 回答
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];

}
于 2013-06-28T14:40:36.067 回答