2013-05-09 2 views
7

배열이 NSStrings이고 하나는 UILabel & UICollectionView입니다.배열의 데이터를 표시하려면 UICollectionViewCell의 단추를 사용하십시오.

내 질문 :

나는 배열의 카운트가 얼마나 많은 UICollectionViewCell의 결정합니다.

UICollectionViewCell에는 버튼이 있습니다. 클릭하면이 버튼을 사용하여 UICollectionViewCell의 번호에 해당하는 배열의 데이터를 레이블에 표시합니다.

예를 들어, 사용자가 13 번째 UICollectionViewCell의 버튼을 클릭하면 배열의 13 번째 NSStringUILabel의 텍스트가됩니다. 내가 무슨 짓을

: 나는이 UICollectionViewCell의 모든 사용 nib 파일에 대한 UICollectionViewCell 내 자신의 서브 클래스를 만든

는 &는 IBAction로 .H 파일에 버튼을 연결. 또한 NSString을 저장하는 배열 속성이 포함 된 MainViewController.h을 가져 왔습니다.

코드 UICollectionViewCell의 코드를 편집 할 때 배열 속성에 액세스 할 수 없습니다. 버튼이 작동합니다 - NSLog를 IBAction의 메소드에 넣었습니다. 작동하지 않습니다.

저는 다른 답변을 수십 번 검색했지만 아무도 내 구체적인 질문에 대답하지 않습니다. 요청할 경우이 코드를 샘플 코드로 업데이트 할 수 있습니다.

+0

상관이 문제에 대한 후속 조치를 처리? – Anupdas

+0

내 주요 문제는 제가 사용하고있는 셀이 내 사용자 지정 UICollectionViewCell 하위 클래스의 인스턴스가 아니라는 것입니다. 나는 일반 UICollectionViewCell 인스턴스를 사용하고 있었다. 신기한 실수. 모든 도움에 감사드립니다! – tagabek

+1

@tagabek 아마도 Anupdas를 수락해야합니까? – Mick

답변

15

나는 내가 UICollectionViewCells의 모든 사용 nib 파일 에 대한 UICollectionViewCell 내 자신의 서브 클래스를 만든 및 IBAction를로 .H 파일로 버튼을 연결했다. 당신이 collectionViewCell의 서브 클래스에 IBAction를 연결하면

당신은 당신이 데이터를 표시하는 곳의 ViewController에서 터치 이벤트를 사용할 수 있도록 대리자를 만들어야합니다.

버튼 하나로 collectionViewCell을 추가하고 IBOutlet을 셀에 연결하면됩니다. 그러나 IBAction은 아닙니다. cellForRowAtIndexPath:에서 collectionView가 포함 된 해당 viewController의 button에 대한 eventHandler를 추가하십시오.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //Dequeue your cell 

    [cell.button addTarget:self 
        action:@selector(collectionViewCellButtonPressed:) 
      forControlEvents:UIControlEventTouchUpInside]; 

    return cell; 

} 


- (IBAction)collectionViewCellButtonPressed:(UIButton *)button{ 

    //Acccess the cell 
    UICollectionViewCell *cell = button.superView.superView; 

    NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell]; 

    NSString *title = self.strings[indexPath.row]; 

    self.someLabel.text = title; 

} 
0

UICollectionViewCell의 동작에서 코드를 편집 할 때 배열 속성에 액세스 할 수 없습니다.

"잘못된"객체에 버튼 동작을 연결했기 때문입니다. MainViewController (또는 )에 연결해야에 배열 속성에 대한 액세스 권한이 있어야합니다. 당신은 여러 가지 작업을 수행해야을해야 할 것

는 :

  • 버튼 액션 메시지를 수신합니다.

  • 배열에 액세스하십시오 (데이터의 경우).

  • 어떤 셀에 레이블이 표시되어야하는지 알려주는 스위치를 두십시오.

  • 컬렉션보기를 reloadData으로 가져 와서 셀을 새로 고침합니다.

그 모든 작업은 가장 편리 객체에 속해야합니다. 나는 이것이 MainViewController라고 추정하고 있으므로 MainViewController가 콜렉션 뷰의 델리게이트/데이터 소스라고 가정하고 있습니다.

+0

UICollectionViewCell 내부에 있기 때문에 버튼 동작은 MainViewController에 연결할 수 없습니다. 레이블은 실제로 UICollectionViewCell.nib이 아닌 MainViewController.xib의 일부입니다 (미정, 지정해야 함). UICollectionView에 50 개의 UICollectionViewCell이 있다고 가정 해 보겠습니다. 컬렉션보기에는 각 셀에 하나씩 총 50 개의 버튼이 있습니다. 배열의 각 색인을 각 셀에 연결하려고합니다. 나는 그것이 도움이되기를 희망한다. 도움에 감사드립니다! – tagabek

+0

"버튼 동작은 MainViewController에 연결할 수 없습니다". 물론 가능합니다. 어쩌면 스토리 보드에서 연결을 그려서 설정할 수는 없겠지만, 코드로 설정할 수 있습니다 ('collectionView : cellForItemAtIndexPath : 구현 '에서 매우 편리한 장소가 될 것입니다. 실제로 또 다른 대답이 있습니다. 그러기 위해서는 -이 속도로는 자신을 위해 생각할 필요가 없을 것입니다.) – matt

1

이 같은 시도하십시오 ..

YourCollectionViewCell.h에서

만들기 함께 IBOutlet하지 IBAction를 당신이 XIB에 추가 된있는 UIButton에 대한 버튼을 불렀다. 콘센트를 xib의 파일 소유자가 아닌 셀 객체에 연결해야한다는 것을 기억하십시오.

MainViewController.m

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 

    cell.button.tag = indexPath.row; 
    [cell.button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
return cell; 
} 

-(void)buttonPressed:(UIButton*)sender 
{ 
    NSLog(@"%d : %@",sender.tag,[array objectAtIndex:sender.tag]); 
    self.textLabel.text = [array objectAtIndex:sender.tag]; 
} 

편집 - 여러 섹션

-(void)buttonPressed:(UIButton*)sender 
{ 
    NSIndexPath *indexPath = [self.collectionView indexPathForCell: (UICollectionViewCell *)sender.superview.superview]; 

NSLog(@"Section : %d Row: %d",indexPath.section,indexPath.row); 

if (0 == indexPath.section) { 
    self.textLabel.text = [firstArray objectAtIndex:indexPath.row]; 
} 
else if(1 == indexPath.section) 
{ 
    self.textLabel.text = [secondArray objectAtIndex:indexPath.row]; 
} 

} 
+0

섹션도 사용해야하는 경우 어떻게 처리합니까? – Anupdas

+0

여러 섹션을 처리하는 것은 불가능합니다. 그러나 여기 OP는 세부 정보를 배열에 저장하고 해당 데이터를 가져 와서 셀 번호와 일치시킵니다. 어느 인턴은 그가 단 하나의 섹션을 가지고 있다는 것을 의미합니다. 그가 단면이 여러 개인 경우 배열을 사용할 수 없습니다. 당신의 답변이 좀 더 일반적인 것을 보았습니다. 그러나 나는 내 코드가 충분하다고 생각한다. –

+0

나는 실제로 4 개의 섹션을 가지고있다. 배열을 사용할 수없는 이유를 설명해 주시겠습니까? – tagabek

관련 문제