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

Ios ipad如何在UITableViewCell中打开弹出式视图控制器,ios,objective-c,ipad,uitableview,Ios,Objective C,Ipad,Uitableview,以下是我正在处理的文件: ChecklistViewController.h ChecklistViewController.m ChecklistTableViewCell.h ChecklistTableViewCell.m ChecklistTableViewCell.xib DetailViewController.h DetailViewController.m DetailViewController.xib 我有一个ChecklistViewController,它显示一个UITa

以下是我正在处理的文件:

  • ChecklistViewController.h
  • ChecklistViewController.m
  • ChecklistTableViewCell.h
  • ChecklistTableViewCell.m
  • ChecklistTableViewCell.xib
  • DetailViewController.h
  • DetailViewController.m
  • DetailViewController.xib
  • 我有一个ChecklistViewController,它显示一个UITableView。因为我需要为UITableViewCell使用不同的布局,所以我有子类UITableViewCell。我创建了一个nib文件ChecklistTableViewCell.xib,它有一个UITableViewCell,其中包含标签、按钮和开关视图。我已将UITableViewCell链接到自定义类ChecklistTableViewCell

    我已将nib文件中的必要输出链接到ChecklistTableViewCell类,并且在ChecklistViewControllerCellForRowatineXpath中,我能够显示标签文本

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

    以下是我的IBAction方法的片段:

    -(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);
    }
    

    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];
        }
    
        ...
    }
    

    如果您想在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];
    

    “弹出”是什么意思?如果您的意思是希望它从底部向上滑动,那么只需使用presentViewController:animated:completion:来显示vp。不需要设置框架,表单有特定的大小。我希望创建一个这样的弹出窗口。您可以通过添加我提到的一行来实现这一点。您可以详细说明使用presentViewController是什么意思吗?我当然不能这样做[self-presentViewController:vp animated:YES completion:nil],因为showPopup方法在ChecklistTableViewCell.m中,而不是在ChecklistViewController.m中。该方法应该在视图控制器中。您需要将目标和操作添加到CellForRowatineXpath中的按钮(以便将目标设置为self),或者需要在cell类中创建委托协议,并将控制器自身设置为委托。然后,您可以在按钮的action方法中调用delegate方法。我还是个新手,所以你的代码很有帮助。我决定使用解决方案1,因为它更干净,因为我希望将所有事件都保存在控制器中。@nuttynibbles没有问题-我手工输入了所有代码,希望没有输入错误:)应该避免在
    UITableView
    中使用
    UIPopoverController
    。这是一个非常不和谐的用户体验