5

我正在开发一个带有自定义拆分视图的 Ipad 应用程序。在主视图中,我有一个 tableViewController。我使用导航栏中的添加按钮在其中添加项目。此按钮通过弹出框链接(我使用情节提要)链接到另一个 tableViewController,其中包含一些用于输入数据的单元格。一个“保存”按钮关闭弹出视图,并在 masterView 列表中添加项目。我接下来要做的是将主视图的原型单元格链接到另一个视图,以使用户能够编辑所选项目。我想将此视图与弹出框链接(就像添加按钮一样),问题出在哪里:我从 xcode 收到一个红色问题:无法编译连接:=> anchorView => >。

这是我的代码示例,可以正常工作。当我点击一个单元格进行编辑时,我也想做同样的事情。

masterSplitView 表

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"assetCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    // Configure the cell...
    AssetModel *myAssetModel = [self.arrayAsset objectAtIndex:indexPath.row];
    cell.textLabel.text = myAssetModel.name;
   // cell.textLabel.text = @"test";

    return cell;

}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if([segue.identifier isEqualToString:@"addAssetSegue"]){
        AddAssetTVC *addAssetTVC = segue.destinationViewController;
        addAssetTVC.delegate = self;

        UIStoryboardPopoverSegue* popoverSegue = (UIStoryboardPopoverSegue*)segue;
        [addAssetTVC setPopoverController:[popoverSegue popoverController]];

    }

}

- (void) theSaveButtonOnTheAddAssetTVCWasTapped:(AddAssetTVC *)controller{
    [controller.navigationController popViewControllerAnimated:YES];
    [self reloadCache];
    [self.tableView reloadData];
    [self viewDidLoad];
}

以及添加视图的保存方法:

- (IBAction)save:(id)sender{
    [popoverController dismissPopoverAnimated:YES];
    NSLog(@"Telling the ADDASSET Delegate that Save was tapped on the AddAssetTVC");

    {...unrevelant coredata methods}

    [self.delegate theSaveButtonOnTheAddAssetTVCWasTapped:self];
}

谢谢你的阅读,

亚历山大

4

3 回答 3

4

我有同样的问题。通过使用自定义 segue 解决了它。在类的prepare方法中:

  1. 获取源视图控制器,它是自定义控制器或UITableViewController
  2. 抓取目标控制器
  3. 使用目标控制器创建一个UIPopoverController初始化
  4. 获取当前选中行的单元格
  5. 将弹出框作为属性存储在目标控制器上(这样您可以将其关闭并且不会被释放)
  6. 使用单元格frame作为弹出窗口CGRect
  7. 设置弹出框的大小,否则它将是最大大小

这是一些示例代码:

UITableViewController *tvc = (UITableViewController *)self.sourceViewController;
DetailsViewController *details = (DetailsViewController *)self.destinationViewController;    
UITableViewCell *cell = [tvc.tableView cellForRowAtIndexPath:[tvc.tableView indexPathForSelectedRow]];

UIPopoverController *pop = [[UIPopoverController alloc] initWithContentViewController:details];

details.popoverController = pop;

CGSize size = CGSizeMake(640, 460);
pop.popoverContentSize = size;


[pop presentPopoverFromRect:cell.frame
                     inView:tvc.tableView 
   permittedArrowDirections:UIPopoverArrowDirectionUp | UIPopoverArrowDirectionDown 
                   animated:YES];
于 2012-06-11T19:39:30.500 回答
0

我已经能够用最少的编码做到这一点。尝试这个:

  1. 我在工具栏或导航栏上添加了一个按钮。这是一个虚拟按钮,将成为 Popover 的锚点。禁用按钮(取消选中启用)。您对多个表格视图使用相同的按钮。我使用按钮中的 Organizer 图标图像来模拟向下钻取,或者您可以在调用 performSegueWithIdentifier 之前在 didSelectRowAtIndex 方法中为每个设置自定义图像或标题...稍后解释...
  2. 然后将按钮连接到您的 Popover 视图。显然将类型设置为 Popover
  3. 点击 Segue 箭头并命名 Segue,例如:“SegToDetail”。
  4. 现在在带有 tableview 的 Master / Parent 代码中添加方法 didSelectRowAtIndex... 在该方法中,您可以设置按钮的外观。最重要的是,您调用: [self performSegueWithIdentifier:@"SegToDetail"... 就是这样...
  5. 现在您可以在 prepareForSegue 方法中传递任何信息,就像在任何 segue 转换中一样。
于 2012-07-08T03:32:27.303 回答
0

基于@Rich 的回答,但PopoverPresentationController在 Swift 中使用和使用。

override func perform() {
    let svc = self.sourceViewController as! yourSourceViewController
    let pvc = self.destinationViewController as! yourPresentedViewController

    // Present the view controller using the popover style
    pvc.modalPresentationStyle = UIModalPresentationStyle.Popover
    svc.presentViewController(pvc, animated: true, completion: nil)

    // Get the popover presentation controller and configure it
    let cell = svc.tableView.cellForRowAtIndexPath(svc.tableView.indexPathForSelectedRow!)
    let presentationController = pvc.popoverPresentationController
    presentationController!.permittedArrowDirections = .Any
    presentationController!.sourceView = svc.tableView
    presentationController!.sourceRect = cell!.frame
}
于 2016-03-08T03:30:31.137 回答