从第二个视图中获取所选项目

时间:2013-06-28 14:30:15

标签: iphone ios uipickerview

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

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

screen snapshot

2 个答案:

答案 0 :(得分: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)。

  6. 从理论上说,你可以简化这个(保留所有的遏制的东西,但抛弃协议),如果你的父母有一类属性,而孩子在理论上可以直接引用,但最好的做法是使用协议,因此孩子控制器对他们的父控制者更加不了解。

    请参阅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];

}