我有一个自定义的UITableViewCell xib,上面有两个按钮。一个编辑按钮,旨在将该单元格的信息传递给新的视图控制器,这是我目前遇到的问题。我在自定义单元格中为TableViewController创建了一个属性,并将按钮连接到此代码:
-(IBAction) editItem {
self.itemsList = [[TheItemsList alloc] init];
[self.itemsList editItem];
NSLog(@"EDIT");
}
在TheItemsList中我有这段代码:
-(void)editItem {
NSLog(@"EDITAGAIN");
EditItem *detailViewController = [[EditItem alloc] initWithNibName:@"EditItem" bundle:nil];
detailViewController.selectedCountry = self.selectedCountry;
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
detailViewController.therow = indexPath.row;
//Pass the selected object to the new view controller.
// Push the view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
}
控制台为每个方法打印我的NSLog,但视图不推送。此代码以前在表视图的didSelectForIndexPath部分中使用,所以我知道它正在推动的视图控制器很好,我只是无法弄清楚这里发生了什么。
更新:
我有SOMEWHAT工作,有点强调。
ItemCell.h
#import <UIKit/UIKit.h>
#import "TheItemsList.h"
@class TheItemsList;
@class ItemCell;
@protocol ItemCellDelegate <NSObject>
@required
-(void)editTheItem:(ItemCell *)theCell;
@end
@interface ItemCell : UITableViewCell
@property (assign) id <ItemCellDelegate> delegate;
@property (nonatomic, retain) IBOutlet UILabel *itemName;
@property (nonatomic, retain) IBOutlet UILabel *itemPrice;
@property (nonatomic, retain) IBOutlet UILabel *itemAisle;
@property (nonatomic, retain) IBOutlet UIImageView *thumbnail;
@property (nonatomic, retain) TheItemsList *itemsList;
@end
的.m
#import "ItemCell.h"
#import "EditItem.h"
@implementation ItemCell
@synthesize itemName = _itemName;
@synthesize itemAisle = _itemAisle;
@synthesize itemPrice = _itemPrice;
@synthesize thumbnail = _thumbnail;
@synthesize itemsList, delegate;
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
}
-(IBAction) editItem {
[self.delegate editTheItem:self];
}
@end
现在,在TableView
中·H
#import <UIKit/UIKit.h>
#import "ItemCell.h"
@class ItemCell;
@protocol ItemCellDelegate;
@interface TheItemsList : UITableViewController <ItemCellDelegate>
的.m
-(void)editTheItem:(ItemCell *)theCell {
NSLog(@"EDITAGAIN");
EditItem *detailViewController = [[EditItem alloc] initWithNibName:@"EditItem" bundle:nil];
detailViewController.selectedCountry = self.selectedCountry;
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
detailViewController.therow = indexPath.row;
//Pass the selected object to the new view controller.
// Push the view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
}
我遇到的是两个问题。
答案 0 :(得分:1)
您应该使用UITableViewCell中的委托模式将按钮委托回UIViewController,其中包含使用单元格的UITableView。
在cellForRowAt:IndexPath中,然后检索单元格并将其委托设置为cell.delegate = self
。在视图控制器中,您实现委托并处理操作。
在单元格中,您设置了一个委托变量(var delegate:MyCellDelegate?),并在editItem函数内部调用委托,如self.delegate?.editItem()
答案 1 :(得分:1)
您的问题基本上是因为这一行
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
单击单元格上的按钮时,它不会选择该行。按钮触摸。解决此问题的方法是找到按钮所在的单元格的NSIndexPath,然后使用它进行操作。一种方法是使用从editAction
委托
-(void)editTheItem:(ItemCell *)theCell
将[self.tableView indexPathForSelectedRow]
替换为[self.tableView indexPathForCell:theCell]