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