gpt4 book ai didi

iphone - 从第二个 View 中获取所选项目

转载 作者:行者123 更新时间:2023-11-29 10:57:56 25 4
gpt4 key购买 nike

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

(这两个 View 中的每一个都有自己的 View Controller 。)

screen snapshot

最佳答案

过程如下:

  1. 定义 subview Controller 通知父 View Controller 的协议(protocol):

    //
    // ChildViewDelegate.h
    //

    #import <Foundation/Foundation.h>

    @protocol ChildViewDelegate <NSObject>

    - (void)didUpdateValueX:(NSString *)string;

    @end

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

  2. 定义父 View Controller 以符合该协议(protocol):

    //
    // ViewController.h
    //

    #import <UIKit/UIKit.h>
    #import "ChildViewDelegate.h"

    @interface ViewController : UIViewController <ChildViewDelegate>

    // the rest of your interface here

    @end
  3. 确保父 Controller 实现该协议(protocol)的方法:

    - (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. 当 child 准备好通知 parent 并解雇自己时,它会做如下事情:

    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);
    }

    这会调用协议(protocol)方法,然后删除自身(调用必要的包含方法,willMoveToParentViewController:nilremoveFromParentViewController)。

理论上,如果你的 parent 有一个类属性,你可以简化这个(保留所有包含的东西,但放弃协议(protocol)),并且 child 理论上可以直接引用它,但最好的做法是使用协议(protocol),所以子 Controller 对他们的父 Controller 更加不可知。

参见 Creating Custom Container View ControllersView Controller Programming Guide 中。有关为什么首先使用这些容器调用很重要的讨论,请参阅 WWDC 2011 视频 Implementing UIViewController Containment .

关于iphone - 从第二个 View 中获取所选项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17367112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com