带有IBOutlets和segues的UICollectionViewCell

时间:2013-02-22 20:02:07

标签: objective-c uicollectionview uistoryboardsegue uicollectionviewcell

我已经创建了一个自定义UICollectionViewCell,里面有几个按钮和标签。我需要每个按钮通过popover显示不同的视图。我尝试在按钮上放置segues,这给了我编译器错误。

".../MainStoryboard_iPad.storyboard: Couldn't compile connection: <IBCocoaTouchOutletConnection:0x4012ea380  <IBProxyObject: 0x4012d7600> => anchorView => <IBUICollectionViewCell: 0x4012d06a0>>"

我尝试将segue放在原型单元本身上,结果相同。我从按钮和标签中删除了所有IBOutlet,仍然会出现编译错误。

如何正确设置集合视图单元格到出口和segues?我已经看过这样做的教程,但它根本就没有用。

TIA!

Janene

1 个答案:

答案 0 :(得分:1)

这对我有用。我希望每个集合视图单元格都有一个按钮,可以弹出一个弹出窗口。

首先,在Interface Builder中,我在故事板中创建了一个新的视图控制器 - 当用户触摸按钮时,此视图控制器是目标弹出窗口。在IB中,确保在Identity Inspector中为此视图控制器提供一个Storyboard ID,我使用了“destinationView”。在Attributes Inspector中,我将Size设置为“Form Sheet”并将Presentation设置为“Form Sheet”。

我将按钮放到源视图控制器上的集合视图中的集合视图单元格中。

在我的源视图控制器中,我创建了一个处理按钮的方法:

- (IBAction)handleButton:(id)sender

然后我将该按钮动作连接到Interface Builder中的源视图控制器中的该方法。

此功能的代码如下所示:

- (IBAction)handleButton:(id)sender
{
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

    // get an instance of the destination view controller 
    // you can set any info that needs to be passed here 
    // just use the "sender" variable to find out what view/button was touched
    DestinationViewController *destVC = [storyboard instantiateViewControllerWithIdentifier:@"destinationView"]; 

    // create a navigation controller (so we can have buttons and a title on the title bar of the popover) 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:destVC];

    // say that we want to present it modally 
    [navController setModalPresentationStyle:UIModalPresentationFormSheet];

    // show the popover 
    [[self navigationController] presentViewController:navController animated:YES completion:^{

    }]; 
}

在我的目标视图控制器中,我添加了一个标题和一个用于解除弹出框的完成按钮:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(dismissExampleButton:)];

    self.title = @"Example Title";
}

- (IBAction)dismissExampleButton:(id)sender
{
    [[self parentViewController] dismissViewControllerAnimated:YES completion:^{

    }]; 
}

请注意,我尝试使用segues。但是,弹出窗口对我来说不起作用,它只是动画到一个新的全尺寸目标视图控制器,即使IB中的设置是“表单”。我如上所述在IB中设置了目标视图控制器,并从源视图控制器创建了一个segue到目标视图控制器。我在属性检查器中给segue一个标识符,就像“exampleSegue”一样。我将我的按钮连接到源视图控制器中的操作。

通过这种方式,源视图控制器看起来像:

- (IBAction)handleButton:(id)sender
{
    [self performSegueWithIdentifier:@"exampleSegue" sender:sender];
}

并且,为了将数据传送到目标视图控制器,我还在源视图控制器中实现了它:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"exampleSegue"]) {

        DestinationViewController *destViewController = (DestinationViewController *)[segue destinationViewController];

        // give the destViewController additional info here
        // destViewController.title.text = @"blah"; 
        // etc. 
    } 
}