0

我有3個類。從UICollectionViewCell類訪問主類

  1. 我實現了一個UICollectionView編程 - collectionViewClass.m
  2. 爲的collectionViewcells配置 - myCells.m
  3. 我有一個類myClass.m調用UICollectionView

有一個在myClass.h,我想在myCells.m訪問我該怎麼做一個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; 
} 
+0

您不應該嘗試從您的單元訪問myClass;該單元不應該知道myClass的任何信息。你試圖完成什麼?此外,你是什麼意思由myClass「調用」UICollectionView? – rdelmar

+0

'myClass'中有一個包含'collectionView'的視圖。我可能在問題中說錯了。 – Eric

+0

這是我想要做的:有一個setter方法(設置單元格中的標籤),每次創建新單元格時都會調用該方法。在該方法中,我想檢查文本是否等於一個字符串。如果是這樣,我想更改'myClass.m'中的標籤。 – Eric

回答

0

我看了一下你的代碼。首先,我進入故事板並將標籤的「標籤」屬性設置爲「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或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; 
} 
+0

感謝您的回答!該標籤在'myClass'類中,而不在collectionView中。所以當我嘗試[collectionView viewWithTag:11]時,這沒有奏效。然後,我嘗試[myClass viewWithTag,但我得到一個錯誤:沒有已知的類選擇器'viewWithTag'方法 – Eric

+0

你指的是哪一個類?是DIDatePicker還是什麼? – Darrell

+0

myClass是我調用DIDatePicker的viewController/class。因此,在DIDatepicker的例子中,myClass相當於DIViewController:https://github.com/noxt/DIDatepicker/blob/master/DIDatepicker/DIViewController.m – Eric

0

你不會從你的細胞叫MyClass的。單元格應該只顯示您的內容。相反,你應該使用delegation pattern

您的單元格可以容納對實現您定義的某個協議的對象的引用。您通過此代理進行溝通並執行您需要的功能。

+0

您能舉個例子嗎? – Eric

+0

@Eric你可能已經知道如何使用委託,甚至可以看看Apple的UICollectionViewDelegate。此外,快速搜索「iOS代理示例」將爲您提供許多教程,幫助您入門。 – Artal

+0

而不是「myCellsDelegate」,您應該使用「UICollectionViewDelegate」。 然後,當你初始化collectionView時,你只需通過'collectionView.delegate = self'設置委託。 您不需要創建委託,只需使用現有的委託視圖即可: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UICollectionViewDelegate_protocol/ – Erakk