0

在非常努力地寻找我的问题的答案后,我才加入这个网站,你们似乎对自己的工作感到惊讶。我想为 iPhone 构建一个简单的介绍应用程序。我遇到的问题是我想使用 UIPickerView 来选择各种选项,我在 pickerview 中有大约 20 个选项。我想做的下一件事是能够在您单击一个选项时打开下一个窗口,我希望在选择器视图中为我的每个选项都有单独的窗口。本质上,我有一个品牌,然后当您通过在 pickerview 上选择该品牌来选择该品牌时,您将继续选择为该品牌制作的正确配件。每个品牌都有单独的配件,这就是为什么我需要为每个品牌提供不同的新窗口。我已经有了我的pickerview 我只是不知道如何进行下一步。通过点击在pickerview上选择一个项目后,我希望它移动到相应的下一个窗口。预先感谢您的帮助。

4

2 回答 2

2

我将假设在声明 UIPickerView 时,您已在 Interface Builder 中或在代码中将委托设置为当前视图,即myPicker.delegate = self;. 同样在您的 .h 文件中,您已将控制器设置为类似于 .h 文件myViewController: UIViewController<UIPickerViewDelegate>

您将实现以下方法并使用row参数来决定接下来要显示哪个视图。此方法在选择一行后被触发(并且在您指定哪个类是选取器视图的委托时被连接到这样做)。假设您使用的是 navigationController,它可能看起来像:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    //For example, you can do a switch based on the row
    switch (row) {
         case 0:
             [self.navigationController pushViewController:myFirstView animated:YES];
             break;
         case 1:
             [self.navigationController pushViewController:mySecondView  animated:YES];
             break;
         // ..
         // ..
         case 19:
             break;
         default:
        //...
    }
}

请注意,如果您在 case 语句中声明一个新变量(例如您的视图控制器之一),则需要{ }在 case 语句中使用大括号才能这样做。

或者,如果您不希望在选择一行后自动触发事件(例如,如果用户不小心选择了一行),您可以创建一个用户按下以确认选择/继续的按钮。按下按钮后,按钮的目标方法可以根据选择器中的选定行进行操作。您可以使用以下方法调用找到选定的行[myPicker selectedRowInComponent:0](假设您的选择器只有一列/“组件”)。

祝你好运!

编辑(阅读您的后续问题后):

假设 SingleComponentPickerViewController.h 是您创建 UIPickerView 的视图。

SingleComponentPickerViewController.h:

@interface SingleComponentPickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource>

SingleComponentPickerViewController.m:

在您的 viewDidLoad 中(或您创建选择器视图的任何位置),设置委托:

-(void) viewDidLoad {
    //...
    myPickerView.delegate = self;
    //...
    [super viewDidLoad];
}

要在上述方法中访问您的 myPickerView 变量,这意味着您的 UIPickerView 对象具有类范围或者是一个属性。

此外,还有在此文件中按下按钮后触发的操作。

-(void)onButtonPress:(id)sender {
    //This gets the currently selected row from the picker
    //Again, assuming you have your picker as a property or class variable
    int row = [myPickerView selectedRowInComponent:0];

    //In your final version you need to use a condition to decide which view to show.
    if (row == 0) {
        AnotherView *anotherViewInstance = [[AnotherView alloc] init];

        //Show "anotherView"
        [self.navigationController pushViewController:anotherViewInstance animated:YES];
    }
    else if (row == 1) {
        AnotherView2 *anotherView2 = [[AnotherView2 alloc] init];

        //Show "anotherView"
        [self.navigationController pushViewController:anotherView2 animated:YES];
    }
    else if (row == 2) {
        AnotherView3 *anotherView3 = [[AnotherView3 alloc] init];

        //Show "anotherView"
        [self.navigationController pushViewController:anotherView3 animated:YES];
    }
    //...continue with the rest of your conditions here
}

如果您使用的是 Interface Builder,那么您应该将返回类型从 更改voidIBAction

SingleComponentAppDelegate.m

现在我假设你的 App DelegatedidFinishLaunchingWithOptions看起来像这样接近尾声:

//....
self.viewController = [[SingleComponentPickerViewController alloc] initWithNibName...];
self.window.rootViewController = self.viewController;     
[self.window makeKeyAndVisible];
return YES;

您想修改它,将窗口的 rootViewController 属性设置为导航控制器,其中包含您的自定义视图控制器。这样,您可以轻松地将视图推送和弹出到屏幕上。

//...
//Create your base view, similar (or even identically) to what was done earlier
SingleComponentPickerViewController *myView = [[SingleComponentPickerViewController alloc] initWithNibName...]; 

//Stick it inside a UINavigationController so you can push and pop views on top of it.
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:myView];

//Assign that to the window's rootViewController, show it, and return
self.window.rootViewController = nav;     
[self.window makeKeyAndVisible];
return YES;
于 2012-06-28T15:35:30.047 回答
0

UIPickerViewDelegate协议参考

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
于 2012-06-28T15:06:03.743 回答