这是交易:
我有一个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
对此的任何见解都会很棒。谢谢!
答案 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
中的viewWillAppear
或DetailViewController
中,您可以将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。