Lor*_*o B 3 protocols uitableview ios objective-c-blocks
我正在找出将数据从UITableViewCells传递给UIableViewController(或UIViewController)的正确机制.
在stackoverflow中搜索我找到了不同的方法来做到这一点,最后我找到了一个运行良好的机制,但我不知道它是否是一个有效的方法.
这就是场景.首先,我创建了一个自定义单元格(与厦门国际银行界面相关),命名DataTableViewCell,扩展UITableViewCell.这个单元格有一些显示(和修改)数据的出口和一个名为index的成瘾属性,如下所示:
@property (nonatomic, copy) NSIndexPath* index;
Run Code Online (Sandbox Code Playgroud)
此属性在以下方法中的cellForRowAtIndexPath方法内刷新UITableViewController:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
DataTableViewCell *cell = (DataTableViewCell*)[tv dequeueReusableCellWithIdentifier:kCellTableIdentifier];
if (cell == nil)
{
[[NSBundle mainBundle] loadNibNamed:@"DataTableViewCell" owner:self options:nil];
cell = (DataTableViewCell*)self.dataTableViewCellOutlet;
}
// configure the cell with data
// do stuff here...
// configure the cell with the current indexPath
cell.index = indexPath;
return cell;
}
Run Code Online (Sandbox Code Playgroud)
由于可以更改单元格中的值,因此我需要将数据传递给UITableViewController更新模型.为此,我决定使用委托机制.所以,我使用如下方法创建了一个协议:
- (void)updateData:(DataItem*)dataItem atIndexPath:(NSIndexPath*)index;
Run Code Online (Sandbox Code Playgroud)
UITableViewController协议的实现.这样,在单元格内(针对某些事件),我可以调用该方法并以正确的方式更新模型.
话虽如此,我还有一些问题要问:
关于街区,我这样想:
在单元格内创建一个属性块,如下所示:
@property (nonatomic, copy) void (^updateModelOnEvent)(DataItem* dataItem);
Run Code Online (Sandbox Code Playgroud)
然后在cellForRowAtIndexPath方法内部UITableViewController将该属性赋值给像这样的块代码(此代码处于同一级别cell.index = indexPath;):
// configure the cell with the current indexPath
cell.updateModelOnEvent = ^(DataItem* dataItem) {
[self.model insertObject:dataItem atIndex:indexPath.row];
};
Run Code Online (Sandbox Code Playgroud)
可能是一个有效的选择?在这种情况下,我是否必须使用复制或保留策略?
先感谢您.
Ell*_*eal 10
为什么不[UITableView indexPathForCell:]与代表一起使用?
MyViewController.h
@interface MyViewController : UITableViewController <MyTableViewCellDelegate>
@end
Run Code Online (Sandbox Code Playgroud)
MyViewController.m
@implementation MyViewController
// methods...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *reuseIdentifier = @"MyCell";
MyTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if (cell == nil)
cell = [[[MyTableViewCell alloc] initWithMyArgument:someArgument reuseIdentifier:reuseIdentifier] autorelease];
[cell setDelegate:self];
// update the cell with your data
return cell;
}
- (void)myDelegateMethodWithCell:(MyTableViewCell *)cell {
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
// update model
}
@end
Run Code Online (Sandbox Code Playgroud)
MyTableViewCell.h
@protocol MyTableViewCellDelegate;
@interface MyTableViewCell : UITableViewCell
@property (assign, nonatomic) id <MyTableViewCellDelegate> delegate;
- (id)initWithMyArgument:(id)someArgument reuseIdentifier:(NSString *)reuseIdentifier;
@end
@protocol MyTableViewCellDelegate <NSObject>
@optional
- (void)myDelegateMethodWithCell:(MyTableViewCell *)cell;
@end
Run Code Online (Sandbox Code Playgroud)
MyTableViewCell.m
@implementation MyTableViewCell
@synthesize delegate = _delegate;
- (id)initWithMyArgument:(id)someArgument reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (self) {
// custom setup
}
return self;
}
- (void)prepareForReuse {
[super prepareForReuse];
self.delegate = nil;
}
- (void)someActionHappened {
if ([self.delegate respondsToSelector:@selector(myDelegateMethodWithCell:)])
[self.delegate myDelegateMethodWithCell:self];
}
@end
Run Code Online (Sandbox Code Playgroud)