UICollectionView:didSelectItemAtIndexPath:如何使用基于选择的数据填充新视图?

时间:2014-02-12 20:09:55

标签: ios objective-c uicollectionview

这是交易:

我有一个UICollectionView,它从一个对象数组中填充自己。我希望能够在我的UICollection视图中点击表示对象的其中一个视图,并转到一个新视图,显示我在UICollectionView中选择的对象的详细信息(例如所选对象的ID)。

不幸的是,无论我尝试设置什么都是空的!

这是对象:

@interface obj : NSObject

    @property (nonatomic, strong) NSString *objId;
    ...
    @property (nonatomic, strong) NSString *imageURL;

@end

这是主视图控制器:

@interface ViewController : UIViewController <UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

    @property (weak, nonatomic) IBOutlet UICollectionView *badgesCollectionView;
    @property (strong, nonatomic) NSArray *objArray;
    ...

@end

以下是详细信息视图:

@interface DetailViewController : UIViewController

    @property (weak, nonatomic) IBOutlet UILabel *objId;

@end

这是我正在尝试填充详细信息视图(在我的主ViewController.m中)

// Implement action for object selection
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{

    DetailViewController *detailView = [[DetailViewController alloc] init];

    detailView.objIdLabel.text = [[self.objArray objectAtIndex:indexPath.row] objId];

    [self.navigationController pushViewController:detailView animated:YES];

    NSLog(@"Object Selection: Report");
    NSLog(@"Label Text      : %@", detailView.objId.text);
    NSLog(@"Id of object    : %@", [[self.objArray objectAtIndex:indexPath.row] objId]);

}

当我在UICollectionView中选择一个对象时,我得到了一个没有填充任何内容的过渡到detailView。这是记录的内容:

Object Selection: Report
Label Text      : (null)
Id of object    : f0f47920-f449-4fd0-a74e-804546905437

对此的任何见解都会很棒。谢谢!

4 个答案:

答案 0 :(得分:1)

问题可能来自DetailViewController实现。

DetailViewController *detailView = [[DetailViewController alloc] init];

仅初始化控制器

但你宣布

@interface DetailViewController : UIViewController

    @property (weak, nonatomic) IBOutlet UILabel *objId;

@end

这意味着你必须使用xib。

所以你首先必须使用

DetailViewController *detailView = [[DetailViewController alloc] initWithNibName:@"DetailViewXIBName" bundle:nil]; 

然后在按下控制器后尝试影响objIdLabel的值:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{

    DetailViewController *detailView = [[DetailViewController alloc] initWithNibName:@"DetailViewXIBName" bundle:nil]; 

    [self.navigationController pushViewController:detailView animated:YES];

    detailView.objIdLabel.text = [[self.objArray objectAtIndex:indexPath.row] objId];

    NSLog(@"Object Selection: Report");
    NSLog(@"Label Text      : %@", detailView.objId.text);
    NSLog(@"Id of object    : %@", [[self.objArray objectAtIndex:indexPath.row] objId]);

} 

调用[super viewDidLoad];后,您必须影响文本。

这些只是假设,因为我们只有有限的信息

答案 1 :(得分:1)

UILabel的文本字段的输出为null,因为在加载视图之前,label属性实际上并未链接到任何内容。在这种情况下,直到你推动视图后才会发生。为了解决这个问题,您可以在DetailViewController上拥有一个属性来保存字符串,直到视图出现。

然后在viewDidLoad中的viewWillAppearDetailViewController中,您可以将objIdLabel上的文字设置为包含字符串的属性

答案 2 :(得分:0)

它可能会推送一个空白视图控制器,因为您没有强烈按住detailView。

尝试添加:

@property (nonatomic, strong) DetailViewController *detailView;

到主ViewController,然后在didSelectItemAtIndexPath方法中:

// Implement action for object selection
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{

    self.detailView = [[DetailViewController alloc] init];

    self.detailView.objIdLabel.text = [[self.objArray objectAtIndex:indexPath.row] objId];

    [self.navigationController pushViewController:self.detailView animated:YES];
}

答案 3 :(得分:0)

事实证明这归结为xib的生命周期。正如你们许多人所建议的那样,在加载之前,detailView实际上并未与所有与之关联的项目(如objId UILabel)链接。

我最终通过创建一个新的单例模型对象来固定所选对象。然后我能够从我的主视图控制器在单例上设置所选对象,并从detailView调用它以在ViewDidLoad上设置我的objId。