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

时间:2014-09-16 05:01:25

标签: ios objective-c ipad uitableview

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

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

    我已将nib文件中的必要插件链接到 ChecklistTableViewCell 类,并且在 ChecklistViewController cellForRowAtIndexPath 中我能够显示标签文本。

    在UITableViewCell类文件 ChecklistTableViewCell 中,我还链接并实现了一个IBAction方法,该方法将在单击按钮时调用。调用此方法时,如何打开 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);
    }
    

2 个答案:

答案 0 :(得分: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 :(得分:0)

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