[英]Use IBAction from UIButton inside custom cell in main view controller
我创建了一个自定义单元格,其中包含自己的.m,.h和.xib文件。 在单元格中,我有一个UIButton,我添加到IB中的xib。
我可以在这个自定义单元格.m中从UIButton接收IBAction,但实际上,我想将该按钮转发到托管表格的主视图.m(以及自定义单元格)并在那里使用操作。
我花了最后4个小时尝试各种方法 - 我应该使用NSNotificationCenter吗? (我已经尝试过Notifications批次,但无法让它工作,不确定我是否应该坚持不懈)
您需要在单元格的.h文件中使用委托。 像这样声明委托
@class MyCustomCell;
@protocol MyCustomCellDelegate
- (void) customCell:(MyCustomCell *)cell button1Pressed:(UIButton *)btn;
@end
然后声明字段和属性
@interface MyCustomCell:UItableViewCell {
id<MyCustomCellDelegate> delegate;
}
@property (nonatomic, assign) id<MyCustomCellDelegate> delegate;
@end
在.m文件中
@synthesize delegate;
并在按钮方法
- (void) buttonPressed {
if (delegate && [delegate respondToSelector:@selector(customCell: button1Pressed:)]) {
[delegate customCell:self button1Pressed:button];
}
}
您的视图控制器必须像这样采用此协议
.h文件
#import "MyCustomCell.h"
@interface MyViewController:UIViewController <MyCustomCellDelegate>
.....
.....
@end
在cellForRow:.m文件中,您需要将属性委托添加到单元格
cell.delegate = self;
最后你从协议实现方法
- (void) customCell:(MyCustomCell *)cell button1Pressed:(UIButton *)btn {
}
抱歉,我的英文和代码。 在没有XCODE的情况下从我的电脑上写下来
我有同样的问题,我通过将单元格子类化为它自己的类来解决它,并将按钮放在那里作为出口,并使用模型中的数据填充单元格,同时使用返回我们当前正在查看的单元格的方法。
例如,如果您有一个Person类,并且每个人都有一个姓名,一个姓氏和一些朋友。 每次单击单元格中的按钮时,特定人员的朋友数量将增加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
我个人创建了一个私有NSArray来保存我的Person对象的名称,并创建一个私有的NSMutableDictionary来保存我的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;
}
我建议使用代表。
您可能只想在视图控制器中为按钮添加一个选择器,该选择器具有您的tableview。
在你的cellForIndexPath函数中
[yourCell.button addTarget:self action:@selector(customActionPressed:) forControlEvents:UIControlEventTouchDown];
然后在“customActionPressed:(id)sender”方法中按下按钮
//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
除非您没有列出更多因素,否则这可能是更好的解决方案。
我有一个教程可能会解释更多http://www.roostersoftstudios.com/2011/05/01/iphone-custom-button-within-a-uitableviewcell/
为什么不为自定义单元格创建委托(使用@protocol)。 然后,您可以将主视图指定为每个单元格的委托,并相应地处理该操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.