我正在开发一个有投资组合的应用程序。因此,这非常适合桌面视图,我正在进行编辑交互;它足够简单,允许用户添加或删除股票,在一个投资组合或其他投资组合中拖动它们,但我无法做到的一件事就是让用户拖动一个投资组合在另一个之上或之下。
我现在有一个hacky解决方案,每个部分的第0行是投资组合名称,如果他们将该行拖到另一个投资组合之上,则整个表格会重新加载投资组合。这有效,但感觉不自然。
我确定我不是第一个遇到这个问题的人;谁有更精致的解决方案?
相关问题 - 如何让用户创建新的投资组合/部分?
答案 0 :(得分:3)
容易腻:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
{
NSMutableArray *_data;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_data = [NSMutableArray arrayWithObjects:@"One", @"Two", @"Three", nil];
self.tableView.editing = YES;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _data.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier = @"reuseIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:identifier];
}
cell.textLabel.text = _data[indexPath.row];
cell.showsReorderControl = YES;
return cell;
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellEditingStyleNone;
}
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
[_data exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];
}
@end
修改强>
你现在要求的内容有点复杂。我创建了一个将表放入单元格的示例,它为您提供嵌套单元格。这个例子非常缺乏吸引力,但它确实有效,并且没有理由让你看起来不漂亮,所以请查看:
https://github.com/MichaelSnowden/TableViewInCell
如果这对您不起作用,请尝试使UITableView moveSection:(NSInteger) toSection:(NSInteger)
看起来漂亮。
Documentation for that method is here
我使用上述方法的经验是它非常易于使用,并且在调用它时看起来很好。使用它的一种聪明方法是使用轻敲手势识别器创建标题。在第一次点击时,突出显示该部分并记录该indexPath,然后在第二次点击时,在两个索引路径上调用该方法。它应该可以很好地工作,但你不会从中拖放。