ipad-如何在 UITableViewCell 中打开弹出视图控制器

Posted

技术标签:

【中文标题】ipad-如何在 UITableViewCell 中打开弹出视图控制器【英文标题】:ipad-how to open a popup view controller in a UITableViewCell 【发布时间】:2014-09-16 05:01:24 【问题描述】:

这些是我正在处理的文件:

    ChecklistViewController.h ChecklistViewController.m ChecklistTableViewCell.h ChecklistTableViewCell.m ChecklistTableViewCell.xib DetailViewController.h DetailViewController.m DetailViewController.xib

我有一个显示 UITableView 的 ChecklistViewController。因为我需要 UITableViewCell 的不同布局,所以我有 UITableViewCell 的子类。我创建了一个 nib 文件 ChecklistTableViewCell.xib,它有一个 UITableViewCell,其中包含 labelbuttonswitch 视图.我已将 UITableViewCell 链接到自定义类 ChecklistTableViewCell

我已将 nib 文件中的必要出口链接到 ChecklistTableViewCell 类,并且在 ChecklistViewController cellForRowAtIndexPath 中我可以显示标签文本。

在 UITableViewCell 类文件ChecklistTableViewCell中,我还链接并实现了一个 IBAction 方法,该方法将在单击按钮时调用。调用此方法时,如何将 DetailViewController 作为弹出窗口打开?

这是我的 IBAction 方法的 sn-p:

-(IBAction)showPopup:(id)sender

    NSLog(@"popup");
    DetailViewController *vp = [[DetailViewController alloc] init];
    vp.modalPresentationStyle = UIModalPresentationFormSheet;
    vp.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    vp.view.superview.frame = CGRectMake(0, 0, 540, 620);

【问题讨论】:

“弹出”是什么意思?如果你的意思是你想让它从底部向上滑动,那么只需使用 presentViewController:animated:completion: 来呈现 vp。无需设置框架,表单具有特定大小。 我正在寻找这样的弹出窗口。 i.stack.imgur.com/iAlDJ.png 你可以通过添加我提到的一行来做到这一点。 您能否详细说明使用 presentViewController 的含义?我当然做不到 [self presentViewController:vp animated:YES completion:nil] 因为 showPopup 方法在 ChecklistTableViewCell.m 而不是 ChecklistViewController.m 该方法应该在视图控制器中。您需要将目标和操作添加到 cellForRowAtIndexPath 中的按钮(这样您就可以将目标设置为 self),或者您需要在单元类中创建一个委托协议,并将控制器设置为委托。然后,您可以在按钮的操作方法中调用委托方法。 【参考方案1】:

rdelmar 的评论很到位。因为presentViewController:animated:completion是视图控制器中的一个方法,你的ChecklistTableViewCell需要让视图控制器知道按钮点击。

你有两个选择:

假设您的数据源是您的视图控制器,在您的视图控制器中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    ChecklistTableViewCell *cell = ...;

    cell.button.tag = indexPath.row; // or whatever appropriate

    [cell.button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];

    return cell;


- (void)buttonTapped:(UIButton *)button

    DetailViewController *vc = ...; // get your "popup" accordingly using button.tag
    [self presentViewController:vc animated:YES completion:nil];

或者您可以声明您的视图控制器遵循的协议:

// ChecklistTableViewCell.m
@protocol ChecklistTableViewCellDelegate
- (void)buttonTapped:(ChecklistTableViewCell *)sender;
@end

@implementation ChecklistTableViewCell : UITableViewCell

    ...

    - (IBAction)showPopup:(id)sender // maybe change the name to something more appropriate
    
        if ([self.delegate respondsToSelector:@selector(buttonTapped:)])
        
            [self.delegate buttonTapped:self];
        
    

    ...


// ChecklistViewController.m
@implementation ChecklistViewController : ChecklistTableViewCellDelegate

    ...

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
        ChecklistTableViewCell *cell = ...;

        cell.tag = indexPath.row; // or whatever appropriate

        cell.delegate = self;

        ...

        return cell;
    

    - (void)buttonTapped:(ChecklistTableViewCell *)sender
    
        DetailViewController *vc = ...; // get your "popup" accordingly using sender.tag
        [self presentViewController:vc animated:YES completion:nil];
    

    ...

【讨论】:

嗨,艾伦,示例代码。我对委派还是很陌生,所以你的代码很有帮助。我决定使用解决方案 1,因为它更干净,因为我想将所有事件保留在控制器中。 @nuttynibbles 没有问题 - 我手动输入了所有代码,希望没有错别字:)【参考方案2】:

如果你想在 iPad 中弹出一个详细视图控制器,有一个名为 UIPopoverController 的控件。

UIPopoverController如何使用?

在.h文件中

    UIPopoverController *popoverController; 

在 .m 文件中

     DetailviewController * objViewController = [[DetailviewController alloc]initWithNibName:@"DetailviewController" bundle:nil];
     obj.delegate = (id )self; // if DetailViecontroller has any delegate.

     popoverController = [[UIPopoverController alloc] initWithContentViewController:objViewController];

     popoverController.popoverContentSize = CGSizeMake(320.0, 400.0);

     UITableViewCell *cell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:theRow inSection:1]];
     CGRect rect=CGRectMake(cell.bounds.origin.x+600, cell.bounds.origin.y+10, 50, 30); 

    [popoverController presentPopoverFromRect:rect  inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

【讨论】:

应避免在UITableView 中使用UIPopoverController。这是一种非常不和谐的用户体验

以上是关于ipad-如何在 UITableViewCell 中打开弹出视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 在 iPad 上的宽度错误

在 iPad 上旋转 UITableView 后,UITableViewCell 附件未正确定位

iPad上的UITableViewCell宽度不正确

UITableViewCell 内的 UITextField 不会在 iPad 上激活,但在 iPhone 上有效

静态 UITableViewCell 背景颜色在 iPad 上总是白色

iPad 上的 UITableViewCell contenView 宽度问题