【问题标题】:Pop-up modal with UITableView on iPhoneiPhone 上带有 UITableView 的弹出模式
【发布时间】:2011-01-31 01:27:26
【问题描述】:

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

我也更愿意在 IB 中展示这个视图。所以为了显示我会从我的视图控制器中做这样的事情(假设我的视图控制器中有一个DialogView *myDialog;的属性)

NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"DialogView" owner:myDialog options:nil];
myDialog = [nibViews objectAtIndex:0];
[self.view addSubview:myDialog];

问题是我正在尝试传递 owner:myDialog,它是 nil,因为它没有被实例化...我可以传递 owner:self 但这会使我的视图控制器成为 File's Owner,这不是那个对话框的方式视图连接在 IB 中。

所以这让我认为这个对话框想要成为另一个成熟的UIViewController...但是,从我读到的所有内容来看,你应该每个屏幕只有一个 UIViewController,所以这让我感到困惑,因为我可以从 @987654328 中受益@ 等与视图控制器一起出现...

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

【问题讨论】:

    标签: iphone cocoa-touch uitableview uiview uiviewcontroller


    【解决方案1】:

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

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

    您可能希望让用户有机会取消选择。一个很好的方法是将新的对话框视图控制器包装在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];
    }
    

    您的 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
    

    你的 OptionViewController.m 会有这样的东西:

    - (void)madeSelection:(NSUInteger)selection
    {
        [delegate OptionViewController:self didFinishWithSelection:selection];
    }
    

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

    - (void)OptionViewController:(OptionViewController*)OptionViewController didFinishWithSelection:(NSUInteger)selection
    {
        // Do something with selection here
    
        [self.navigationController dismissModalViewControllerAnimated:YES];
    }
    

    在 Apple 的示例源代码中有大量示例遵循这种一般模式。

    【讨论】:

    • 非常有帮助...尤其是协议的东西!谢谢!但我认为这并不能满足我对这个对话框的需求,它更像是一个 AlertView,而不是一个带有 UINavigationController 的全屏视图。理想情况下,它比 UIAlertView 大一点,并且里面有一个小的(3 行)UITableView,下面有一个取消按钮。同样,在这种情况下,回到 UIViewController 与 UIView ......将有一个视图控制器控制在此模式“对话框”后面仍然可见的视图。也就是说,让另一个视图控制器控制对话框仍然可以吗?很抱歉造成混乱...
    • 您不想使用“全屏视图”的原因是什么?查看您设备上的应用程序(尤其是来自 Apple 的应用程序),并计算您看到以任何其他方式呈现的 2-5 个选项列表的次数。这正是大多数应用程序的做法;如果不是一致的,也是因为这是用户可能期望的。请注意,使用 UIAlertView 并不合适,因为它们通常保留用于用户必须立即采取的操作。应该使用可用于该任务的最佳工具来从列表中选择一个选项:表格视图。
    • 您还可以选择在 UIActionSheet 中使用 UIPickerView,这消除了对 UITableView/控制器的需求,还为您提供了方便的完成和取消按钮。如果您想要示例代码,我可以发布一些可能的答案。
    • 嗯,Game Kit 的 peerPickerController 是带有嵌入式 tableview 的部分屏幕模式视图的一个示例......我知道在大多数情况下,Frog 建议的方式是首选,甚至是最有意义的。 ..但在我的这种特殊情况下,它没有......所以问题仍然存在......如何?我已经尝试过 UIViewController 方法,但如果 UIViewController 的视图不是全屏,SDK 会自动填充到屏幕的边界,这显然会失败。所以,我想我留下了一个自定义的 UIView。 UIPickerView 是个好主意,但我担心我的“单元格”文本会太宽......
    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多