7

고유 한 .m, .h 및 .xib 파일로 사용자 정의 셀을 작성했습니다. 셀에는 IB의 xib에 추가 한 UIButton이 있습니다.기본보기 컨트롤러에서 사용자 정의 셀 안의 UIButton에서 IBAction을 사용하십시오.

이 사용자 지정 셀의 .m의 UIButton에서 IBAction을받을 수 있지만, 실제로이 단추를 기본보기로 전달하고 싶습니다. (테이블을 사용자 지정하는 셀) 및 거기서 행동을 취하십시오.

NSNotificationCenter를 사용해야합니까? 지난 4 시간 동안이 작업을 여러 가지 방법으로 시도했습니다.

+0

NSNotificationCenter는 합리적인 전략이라고 생각합니다. 버튼의 액션 메소드가 보내는 알림 또는 다른 문제를받지 못하고 있습니까? –

+0

나는 너무나 생각했다 - 나는 그들을 아직 구현하는 요령을 가지고 있다고 생각하지 않는다 ... 더 많은 연습. 이제 같은보기에서 작동하도록 할 수 있지만 다른보기를 시도 할 때 예외가 생깁니다. 우리는 거기에 도달 할 것입니다. –

+0

위임 프로토콜을 만들고 사용하는 방법에 대한 설명입니다. http://www.dosomethinghere.com/2009/07/18/setting-up-a-delegate-in-the-iphone-sdk/ – MystikSpiral

답변

9

셀의 .h 파일에서 델리게이트를 사용해야합니다. 이

@class MyCustomCell; 
@protocol MyCustomCellDelegate 
- (void) customCell:(MyCustomCell *)cell button1Pressed:(UIButton *)btn; 
@end 

같은 위임 후하는 .m 파일

@synthesize delegate; 

및 버튼 방식

- (void) buttonPressed { 
    if (delegate && [delegate respondToSelector:@selector(customCell: button1Pressed:)]) { 
     [delegate customCell:self button1Pressed:button]; 
    } 
} 

로보기 제어기 필드 속성

@interface MyCustomCell:UItableViewCell { 
    id<MyCustomCellDelegate> delegate; 
} 

@property (nonatomic, assign) id<MyCustomCellDelegate> delegate; 

@end 

선언 선언 무 방법은 당신이

cell.delegate = self; 

를 셀에 속성 대리인을 추가해야합니다 그리고 마지막으로 당신은 프로토콜의 메소드를 구현 : ST는 cellForRow에서하는 .m 파일에이

.H 파일

#import "MyCustomCell.h" 

@interface MyViewController:UIViewController <MyCustomCellDelegate> 
..... 
..... 
@end 

처럼이 프로토콜을 채택

- (void) customCell:(MyCustomCell *)cell button1Pressed:(UIButton *)btn { 

} 

죄송합니다. 내 영어 및 코드.

+0

- (void) buttonPressed { if (delegate && [delegate respondToSelector : @selector (customCell : button1Pressed :)]) { [delegate customCell : self button1Pressed : button]; } } [위임장 customCell : self button1Pressed : button]에서 "button"을 어디에서 얻을 수 있습니까? 컨트롤러에 메서드를 추가하면 다른 viewcontroller를 표시하는 예제 코드는 무엇이겠습니까? thanks – zramled

+0

다른보기 컨트롤러를 표시하려면 [self presentViewController : animated : completion :]; 또는 [self.navigationController pushViewController : animated :] – Moonkid

+0

@Moonkid는 이에 대한 신속한 답변이 있습니까? –

0

내가 사용하는 것이 좋습니다 것입니다 (나는 알림을 많이 해봤지만 내가 인내 할 필요가있는 경우 확인이 작동하도록하지 수)를 delegate.

당신은 단지 버튼에 대한 선택기를 추가 할 수 있습니다
0

귀하의 tableview 귀하의보기 컨트롤러. 더이없는 한이 당신을 위해 더 나은 해결책이 될 수 있습니다 방법

//Get the superview from this button which will be our cell 
UITableViewCell *owningCell = (UITableViewCell*)[sender superview]; 

//From the cell get its index path. 
NSIndexPath *pathToCell = [myTableView indexPathForCell:owningCell]; 

    //Do something with our path 

을 : 당신의 cellForIndexPath 기능에

[yourCell.button addTarget:self action:@selector(customActionPressed:) forControlEvents:UIControlEventTouchDown]; 

그런 다음 "(ID) 보낸 사람 customActionPressed"의 버튼을 눌러 처리 당신이 목록에없는 요소들.

내가 설명 할 수있는 튜토리얼이 더 http://www.roostersoftstudios.com/2011/05/01/iphone-custom-button-within-a-uitableviewcell/

+0

고마워, 실제로 plist (조금 끈적 끈적하지만 잘 작동하는)을 선택하기 위해 셀을 선택하는 데 사용하는 방법 때문에 버튼의 경로를 아는 것이 좋았습니다. 튜토리얼을 시험해보고 다른 방식으로 문제에 접근 할 수 있는지 알아 보겠습니다. –

+0

좋은 소리. 인덱스를 알고 있고 어떻게 든이를 사용하여 필요한 데이터를 얻을 수 있다면 소유 한 뷰 컨트롤러에서 작업을 수행하는 데 필요한 모든 것이있을 수 있습니다. 행운을 빌어 요 – rooster117

+0

위임을 사용하는 다른 제안을 보는 것도 좋은 생각입니다. 이 튜토리얼은 제가 작성한 튜토리얼입니다. [link] http://www.roostersoftstudios.com/2011/04/12/simple-delegate-tutorial-for-ios-development/ – rooster117

0

왜 사용자 정의 셀 대리인 (@protocol을 사용)를 만들 수 없습니다. 그런 다음 주 뷰를 각 셀의 위임자로 지정하고 작업을 적절하게 처리 할 수 ​​있습니다.

+0

나는 내가 연구원들을 더 잘 연구 할 것이라고 생각한다 ... 나는 그곳에서 무엇을 할 것인지 단서가 없다 !! –

1

나는 똑같은 문제가 있었는데, 그걸로 셀을 서브 클래스 화하고 그곳에 단추를 놓고 콘센트로 단추를 넣고 사용하면서 모델의 데이터로 채 웁니다. 현재보고있는 셀을 반환하는 메서드입니다.

예를 들어, Person 클래스가 있고 각 사람이 이름, 성 및 친구가있는 경우. 그리고 당신은 셀에서 버튼을 클릭 할 때마다, 특정인에 대한 친구의 수는 내 사람 개체의 이름을 보유하는 개인 NSArray를, 그리고 개인 NSMutableDictionary 생성 1. ​​개인적으로

_______________DATA SOURCE___________________________ 
#import <Foundation/Foundation.h> 

@interface Person : NSObject 

@property (nonatomic, strong) NSString *name; 
@property (nonatomic, strong) NSString *comment; 
@property (nonatomic) NSInteger numberOfFriends; 


+(instancetype)personWithName:(NSString *)aName Surname:(NSString *)aSurname; 

@end 

#import "Person.h" 

@implementation Person 

+(instancetype)personWithName:(NSString *)aName Surname:(NSString *)aSurname{ 

    Person *person = [[Person alloc] init]; 
    [person setName:aName]; 
    [person setSurname:aSurname]; 
    [person setNumberOfFriends:0]; 

    return person; 
} 

@end 

_____________________PERSON CELL________________________ 

#import <UIKit/UIKit.h> 

@interface PersonCell : UITableViewCell 

@property (strong, nonatomic) IBOutlet UILabel *friendsNum; 
@property (strong, nonatomic) IBOutlet UIButton *friendsBtn; 
@property (strong, nonatomic) IBOutlet UILabel *nameLabel; 
@property (strong, nonatomic) IBOutlet UILabel *surnameLabel; 


@end 

으로 증가 할 것 내 Person 객체를 유지하기 위해 키를 사람들의 이름으로 설정합니다.

_____________________PERSON TABLE VIEW________________________  
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    NSString *name = [peopleNames objectAtIndex:indexPath.row]; 
    Person *person = [people objectForKey:name]; 

    if(cell == nil) 
    { 
     cell = [[PersonCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    // Configure the cell... 
    cell.nameLabel.text = person.name; 
    cell.surname.Label.text = person.surname 

    [cell.friendsButton addTarget:self action:@selector(moreFriends:) forControlEvents:UIControlEventTouchUpInside]; 

    cell.friendsNum.text = [NSString stringWithFormat:@"%i", person.numberOfFriends]; 

    return cell; 
} 

- (IBAction)moreFriends:(id)sender { 
    UIButton *btn = (UIButton *)sender; 
    PersonCell *cell = [self parentCellForView:btn]; 
    Person *person = [people objectForKey:cell.nameLabel.text]; 
    person.numberOfFriends++; 
    [self.tableView reloadData]; 
} 

-(PersonCell *)parentCellForView:(id)theView 
{ 
    id viewSuperView = [theView superview]; 
    while (viewSuperView != nil) { 
     if ([viewSuperView isKindOfClass:[PersonCell class]]) { 
      return (PersonCell *)viewSuperView; 
     } 
     else { 
      viewSuperView = [viewSuperView superview]; 
     } 
    } 
    return nil; 
}