在iPhone上使用UITableView弹出模式

Mel*_*emi 3 iphone cocoa-touch uitableview uiviewcontroller uiview

我需要弹出一个快速对话框,让用户从大约2-5项的列表中选择UITableView中的一个选项.对话框将是模态的,只占用屏幕的1/2左右.我在如何处理这个问题之间来回走动.我应该继承UIView并使它成为UITableViewDelegate&DataSource

我也更愿意在IB中列出这个观点.所以要显示我从我的视图控制器做这样的事情(假设我的视图控制器中有一个属性DialogView *myDialog;)

NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"DialogView" owner:myDialog options:nil];
myDialog = [nibViews objectAtIndex:0];
[self.view addSubview:myDialog];
Run Code Online (Sandbox Code Playgroud)

问题是我正在尝试传递所有者:myDialog是nil,因为它尚未实例化...我可以传递所有者:self但这将使我的视图控制器,File's Owner而不是如何在IB中连接该对话视图.

所以这让我觉得这个对话想要成为另一个全面的UIViewController...但是,从我所读过的所有内容中,每个屏幕应该只有一个UIViewController,所以这让我感到困惑,因为我可以从viewDidLoad视图中获益等等控制器...

有人可以帮我解决这个问题吗?

Sha*_*rog 7

屏幕上没有视图控制器这样的东西; 它view在屏幕上.话虽如此,您可以一次在屏幕上显示任意数量的视图.

我会创建一个新的视图和视图控制器.你不会UIView成为一个UITableViewDelegate,你UIViewController成为一个UITableViewDelegate.但是UITableViewController,如果您使用的是iPhone OS 3.x + ,而不是手动执行此操作,而是将新视图控制器作为子类.然后,您可以以模态方式呈现此视图控制器.

您可能希望让用户有机会取消选择.一个好方法是将新的对话框视图控制器包装在a中UINavigationController,然后在导航栏中放入"取消"按钮.然后使用委托模式通知父视图控制器用户已做出选择,以便您可以弹出堆栈.

当您想要显示此选项对话框时,以下是父视图控制器中的代码:

- (void)showOptionView
{
    OptionViewController* optionViewController = [[OptionViewController alloc] initWithNibName:@"OptionView" bundle:nil];
    optionViewController.delegate = self;
    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:optionViewController];
    [self.navigationController presentModalViewController:navController animated:YES];
    [navController release];
    [optionViewController release];
}
Run Code Online (Sandbox Code Playgroud)

您的OptionViewController .h将如下所示:

@protocol OptionViewControllerDelegate;

@interface OptionViewController : UITableViewController
{
    id<OptionViewControllerDelegate> delegate;
}

@property (nonatomic, assign) id<OptionViewControllerDelegate> delegate;

@end

@protocol OptionViewControllerDelegate <NSObject>
- (void)OptionViewController:(OptionViewController*)OptionViewController didFinishWithSelection:(NSString*)selection;
// or maybe
- (void)OptionViewController:(OptionViewController*)OptionViewController didFinishWithSelection:(NSUInteger)selection;
// etc.
@end
Run Code Online (Sandbox Code Playgroud)

您的OptionViewController.m将具有以下内容:

- (void)madeSelection:(NSUInteger)selection
{
    [delegate OptionViewController:self didFinishWithSelection:selection];
}
Run Code Online (Sandbox Code Playgroud)

在原始视图控制器中有一个匹配的方法,如:

- (void)OptionViewController:(OptionViewController*)OptionViewController didFinishWithSelection:(NSUInteger)selection
{
    // Do something with selection here

    [self.navigationController dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)

Apple的示例源代码中有大量示例遵循此一般模式.

  • 您还可以选择在UIActionSheet中使用UIPickerView,这样就无需使用UITableView /控制器,还可以为您提供方便的完成和取消按钮.如果你想要示例代码,我可以发布一些可能的答案. (2认同)