从 UICollectionViewCell class 访问主 class
Access main class from UICollectionViewCell class
我有 3 个 class。
- 我以编程方式实现了
UICollectionView
-
collectionViewClass.m
。
- 配置为
cells
的collectionView
- myCells.m
- 我有一个 class
myClass.m
调用 UICollectionView
.
我想在 myCells.m
中访问 myClass.h
中的 label
我该怎么做?
我试过了:
myClass *mainClass = [[myClass alloc] init];
mainClass.myLabel.text = @"Something";
但这会创建 myClass
的新实例。如何从 myCells
访问相同的 myClass
?
更新
myCells.h
@protocol myCellsDelegate
- (void)changeLabelName;
@end
@interface myCells : UICollectionViewCell
@property (strong, nonatomic) id<myCellsDelegate> delegate;
@end
myCells.m
- (void)someMethod
{
[self.delegate changeLabelName];
}
myClass.h
@interface MyViewController: UIViewController <myCellsDelegate>
myClass.m
- (void)changeLabelName {
NSLog(@"Something");
}
为什么 NSLog
运行 没有?
更新 2
这里是我初始化cell
的地方:
- (UICollectionView *)datesCollectionView
{
if (!_datesCollectionView) {
...
_datesCollectionView = [[UICollectionView alloc] initWithFrame:self.bounds collectionViewLayout:collectionViewLayout];
[_datesCollectionView registerClass:[myCells class] forCellWithReuseIdentifier:kDIDatepickerCellIndentifier];
_datesCollectionView.dataSource = self;
_datesCollectionView.delegate = self;
[self addSubview:_datesCollectionView];
}
return _datesCollectionView;
}
您不会从您的单元格中调用 myClass。单元格应该只显示您的内容。相反,您应该使用 delegation pattern.
您的单元格可以包含对实现您定义的特定协议的对象的引用。您通过此委托进行交流并执行所需的功能。
我看了你的代码。首先,我进入故事板并将标签的 "tag" 属性 设置为“11”(它可以是您想要的任何数字,只要没有其他东西使用该数字作为标签)。
然后在你的-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
我把这段代码:
UILabel *myLabel = [[UILabel alloc] init];
myLabel = (UILabel*)[collectionView viewWithTag:11];
//check myLabel.text against whatever you want
最终方法如下所示,您可以添加自己的 "isEqual or isEqualToString" 检查:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
DIDatepickerCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kDIDatepickerCellIndentifier forIndexPath:indexPath];
UILabel *myLabel = [[UILabel alloc] init];
myLabel = (UILabel*)[collectionView viewWithTag:11];
//check myLabel.text against whatever you want
cell.date = [self.dates objectAtIndex:indexPath.item];
cell.itemSelectionColor = _selectedDateBottomLineColor;
return cell;
}
我有 3 个 class。
- 我以编程方式实现了
UICollectionView
-collectionViewClass.m
。 - 配置为
cells
的collectionView
-myCells.m
- 我有一个 class
myClass.m
调用UICollectionView
.
我想在 myCells.m
中访问 myClass.h
中的 label
我该怎么做?
我试过了:
myClass *mainClass = [[myClass alloc] init];
mainClass.myLabel.text = @"Something";
但这会创建 myClass
的新实例。如何从 myCells
访问相同的 myClass
?
更新
myCells.h
@protocol myCellsDelegate
- (void)changeLabelName;
@end
@interface myCells : UICollectionViewCell
@property (strong, nonatomic) id<myCellsDelegate> delegate;
@end
myCells.m
- (void)someMethod
{
[self.delegate changeLabelName];
}
myClass.h
@interface MyViewController: UIViewController <myCellsDelegate>
myClass.m
- (void)changeLabelName {
NSLog(@"Something");
}
为什么 NSLog
运行 没有?
更新 2
这里是我初始化cell
的地方:
- (UICollectionView *)datesCollectionView
{
if (!_datesCollectionView) {
...
_datesCollectionView = [[UICollectionView alloc] initWithFrame:self.bounds collectionViewLayout:collectionViewLayout];
[_datesCollectionView registerClass:[myCells class] forCellWithReuseIdentifier:kDIDatepickerCellIndentifier];
_datesCollectionView.dataSource = self;
_datesCollectionView.delegate = self;
[self addSubview:_datesCollectionView];
}
return _datesCollectionView;
}
您不会从您的单元格中调用 myClass。单元格应该只显示您的内容。相反,您应该使用 delegation pattern.
您的单元格可以包含对实现您定义的特定协议的对象的引用。您通过此委托进行交流并执行所需的功能。
我看了你的代码。首先,我进入故事板并将标签的 "tag" 属性 设置为“11”(它可以是您想要的任何数字,只要没有其他东西使用该数字作为标签)。
然后在你的-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
我把这段代码:
UILabel *myLabel = [[UILabel alloc] init];
myLabel = (UILabel*)[collectionView viewWithTag:11];
//check myLabel.text against whatever you want
最终方法如下所示,您可以添加自己的 "isEqual or isEqualToString" 检查:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
DIDatepickerCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kDIDatepickerCellIndentifier forIndexPath:indexPath];
UILabel *myLabel = [[UILabel alloc] init];
myLabel = (UILabel*)[collectionView viewWithTag:11];
//check myLabel.text against whatever you want
cell.date = [self.dates objectAtIndex:indexPath.item];
cell.itemSelectionColor = _selectedDateBottomLineColor;
return cell;
}