- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我的问题是,这是否可能,如果可能,您将如何完成这项任务?
有人知道已经在使用此功能的应用程序,或者可以从哪里获得一些示例代码吗?
此外,如果我要在对主题了解不多的情况下自行实现此操作,您估计需要多长时间才能完成?
还有一件事要提,因为它可能会使事情变得更复杂:目标表默认处于编辑模式,以便用户可以重新排列单元格(使用附件 View 中的标准重新排序控件),这些单元格已经被删除那里。
编辑:
我只是想在我的帖子中包含一张概念图片的屏幕截图。该图在左侧显示了一个表格,在右侧显示了一个浅灰色的拖放区域。我的客户说他也在其他应用程序上看到了这个,所以一定有某种我不知道的 ui 元素。
我还没有在开发者库中找到任何关于这样一个放置区域的信息,所以希望你们中的一个能给我指路或解决问题。
最佳答案
好的,我自己设法实现了这个,我对结果很满意。您可以将单元格从左侧(源表)拖动到右侧(目标表),也可以在目标表内拖动单元格以进行重新排序。如果您尝试从右向左拖动单元格,它将重新插入到您开始拖动的相同位置(因此没有任何反应)。目标表也支持删除单元格,源表不支持。所以这是完整的代码:
UIDropTableViewController.h
#import <UIKit/UIKit.h>
@interface UIDropTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate>
{
UINavigationItem* srcTableNavItem;
UINavigationItem* dstTableNavItem;
UITableView* srcTableView;
UITableView* dstTableView;
UITableViewCell* draggedCell;
UIView* dropArea;
NSMutableArray* srcData;
NSMutableArray* dstData;
id draggedData;
BOOL dragFromSource; // used for reodering
NSIndexPath* pathFromDstTable; // used to reinsert data when reodering fails
}
@property (nonatomic, readonly) NSArray* srcData;
@property (nonatomic, readonly) NSArray* dstData;
- (id)initWithFrame:(CGRect)frame SourceData:(NSArray*)sourceData DestinationData:(NSArray*)destinationData;
- (void)setSrcTableTitle:(NSString*)title;
- (void)setDstTableTitle:(NSString*)title;
@end
UIDropTableViewController.m
#import "UIDropTableViewController.h"
#define kCellIdentifier @"DropTableCell"
#define kCellHeight 44
#define kNavBarHeight 30
// forward declaration of private helper methods
@interface UIDropTableViewController()
- (void)setupSourceTableWithFrame:(CGRect)frame;
- (void)setupDestinationTableWithFrame:(CGRect)frame;
- (void)initDraggedCellWithCell:(UITableViewCell*)cell AtPoint:(CGPoint)point;
- (void)startDragging:(UIPanGestureRecognizer *)gestureRecognizer;
- (void)startDraggingFromSrcAtPoint:(CGPoint)point;
- (void)startDraggingFromDstAtPoint:(CGPoint)point;
- (void)doDrag:(UIPanGestureRecognizer *)gestureRecognizer;
- (void)stopDragging:(UIPanGestureRecognizer *)gestureRecognizer;
- (UITableViewCell*)srcTableCellForRowAtIndexPath:(NSIndexPath*)indexPath;
- (UITableViewCell*)dstTableCellForRowAtIndexPath:(NSIndexPath*)indexPath;
@end
@implementation UIDropTableViewController
@synthesize srcData, dstData;
#pragma mark -
#pragma mark Public Methods
- (void)setSrcTableTitle:(NSString*)title
{
srcTableNavItem.title = title;
}
- (void)setDstTableTitle:(NSString*)title
{
dstTableNavItem.title = title;
}
#pragma mark -
#pragma mark UIViewController
- (id)initWithFrame:(CGRect)frame SourceData:(NSArray*)sourceData DestinationData:(NSArray*)destinationData
{
self = [super init];
if (self)
{
self.view.clipsToBounds = YES;
self.view.frame = frame;
int width = frame.size.width;
int height = frame.size.height;
// set up data
srcData = [[NSMutableArray alloc] initWithArray:sourceData];
dstData = [[NSMutableArray alloc] initWithArray:destinationData];
draggedCell = nil;
draggedData = nil;
pathFromDstTable = nil;
// set up views
[self setupSourceTableWithFrame:CGRectMake(0, 0, width / 2, height)];
[self setupDestinationTableWithFrame:CGRectMake(width / 2, 0, width / 2, height)];
UIView* separator = [[UIView alloc] initWithFrame:CGRectMake(width / 2, 0, 1, height)];
separator.backgroundColor = [UIColor blackColor];
[self.view addSubview:separator];
[separator release];
// set up gestures
UIPanGestureRecognizer* panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanning:)];
[self.view addGestureRecognizer:panGesture];
[panGesture release];
}
return self;
}
- (void)dealloc
{
[srcTableNavItem release];
[dstTableNavItem release];
[srcTableView release];
[dstTableView release];
[dropArea release];
[srcData release];
[dstData release];
if(draggedCell != nil)
[draggedCell release];
if(draggedData != nil)
[draggedData release];
if(pathFromDstTable != nil)
[pathFromDstTable release];
[super dealloc];
}
- (void)viewWillAppear:(BOOL)animated
{
[srcTableView reloadData];
[dstTableView reloadData];
[UIView animateWithDuration:0.2 animations:^
{
CGRect frame = dstTableView.frame;
frame.size.height = kCellHeight * [dstData count];
dstTableView.frame = frame;
}];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}
#pragma mark -
#pragma mark Helper methods for initialization
- (void)setupSourceTableWithFrame:(CGRect)frame
{
srcTableNavItem = [[UINavigationItem alloc] init];
srcTableNavItem.title = @"Source Table";
CGRect navBarFrame = frame;
navBarFrame.size.height = kNavBarHeight;
UINavigationBar* navigationBar = [[UINavigationBar alloc] initWithFrame:navBarFrame];
[navigationBar pushNavigationItem:srcTableNavItem animated:false];
[navigationBar setTintColor:[UIColor lightGrayColor]];
[self.view addSubview:navigationBar];
[navigationBar release];
CGRect tableFrame = frame;
tableFrame.origin.y = kNavBarHeight;
tableFrame.size.height -= kNavBarHeight;
srcTableView = [[UITableView alloc] initWithFrame:tableFrame];
[srcTableView setDelegate:self];
[srcTableView setDataSource:self];
[self.view addSubview:srcTableView];
}
- (void)setupDestinationTableWithFrame:(CGRect)frame
{
dstTableNavItem = [[UINavigationItem alloc] init];
dstTableNavItem.title = @"Destination Table";
CGRect navBarFrame = frame;
navBarFrame.size.height = kNavBarHeight;
UINavigationBar* navigationBar = [[UINavigationBar alloc] initWithFrame:navBarFrame];
[navigationBar pushNavigationItem:dstTableNavItem animated:false];
[navigationBar setTintColor:[UIColor lightGrayColor]];
[self.view addSubview:navigationBar];
[navigationBar release];
CGRect dropAreaFrame = frame;
dropAreaFrame.origin.y = kNavBarHeight;
dropAreaFrame.size.height -= kNavBarHeight;
dropArea = [[UIView alloc] initWithFrame:dropAreaFrame];
[dropArea setBackgroundColor:[UIColor grayColor]];
[self.view addSubview:dropArea];
CGRect contentFrame = dropAreaFrame;
contentFrame.origin = CGPointMake(0, 0);
UILabel* dropAreaLabel = [[UILabel alloc] initWithFrame:contentFrame];
dropAreaLabel.backgroundColor = [UIColor clearColor];
dropAreaLabel.font = [UIFont boldSystemFontOfSize:12];
dropAreaLabel.textAlignment = UITextAlignmentCenter;
dropAreaLabel.textColor = [UIColor whiteColor];
dropAreaLabel.text = @"Drop items here...";
[dropArea addSubview:dropAreaLabel];
[dropAreaLabel release];
CGRect tableFrame = contentFrame;
tableFrame.size.height = kCellHeight * [dstData count];
dstTableView = [[UITableView alloc] initWithFrame:tableFrame];
[dstTableView setEditing:YES];
[dstTableView setDelegate:self];
[dstTableView setDataSource:self];
[dropArea addSubview:dstTableView];
}
- (void)initDraggedCellWithCell:(UITableViewCell*)cell AtPoint:(CGPoint)point
{
// get rid of old cell, if it wasn't disposed already
if(draggedCell != nil)
{
[draggedCell removeFromSuperview];
[draggedCell release];
draggedCell = nil;
}
CGRect frame = CGRectMake(point.x, point.y, cell.frame.size.width, cell.frame.size.height);
draggedCell = [[UITableViewCell alloc] init];
draggedCell.selectionStyle = UITableViewCellSelectionStyleGray;
draggedCell.textLabel.text = cell.textLabel.text;
draggedCell.textLabel.textColor = cell.textLabel.textColor;
draggedCell.highlighted = YES;
draggedCell.frame = frame;
draggedCell.alpha = 0.8;
[self.view addSubview:draggedCell];
}
#pragma mark -
#pragma mark UIGestureRecognizer
- (void)handlePanning:(UIPanGestureRecognizer *)gestureRecognizer
{
switch ([gestureRecognizer state]) {
case UIGestureRecognizerStateBegan:
[self startDragging:gestureRecognizer];
break;
case UIGestureRecognizerStateChanged:
[self doDrag:gestureRecognizer];
break;
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateCancelled:
case UIGestureRecognizerStateFailed:
[self stopDragging:gestureRecognizer];
break;
default:
break;
}
}
#pragma mark -
#pragma mark Helper methods for dragging
- (void)startDragging:(UIPanGestureRecognizer *)gestureRecognizer
{
CGPoint pointInSrc = [gestureRecognizer locationInView:srcTableView];
CGPoint pointInDst = [gestureRecognizer locationInView:dstTableView];
if([srcTableView pointInside:pointInSrc withEvent:nil])
{
[self startDraggingFromSrcAtPoint:pointInSrc];
dragFromSource = YES;
}
else if([dstTableView pointInside:pointInDst withEvent:nil])
{
[self startDraggingFromDstAtPoint:pointInDst];
dragFromSource = NO;
}
}
- (void)startDraggingFromSrcAtPoint:(CGPoint)point
{
NSIndexPath* indexPath = [srcTableView indexPathForRowAtPoint:point];
UITableViewCell* cell = [srcTableView cellForRowAtIndexPath:indexPath];
if(cell != nil)
{
CGPoint origin = cell.frame.origin;
origin.x += srcTableView.frame.origin.x;
origin.y += srcTableView.frame.origin.y;
[self initDraggedCellWithCell:cell AtPoint:origin];
cell.highlighted = NO;
if(draggedData != nil)
{
[draggedData release];
draggedData = nil;
}
draggedData = [[srcData objectAtIndex:indexPath.row] retain];
}
}
- (void)startDraggingFromDstAtPoint:(CGPoint)point
{
NSIndexPath* indexPath = [dstTableView indexPathForRowAtPoint:point];
UITableViewCell* cell = [dstTableView cellForRowAtIndexPath:indexPath];
if(cell != nil)
{
CGPoint origin = cell.frame.origin;
origin.x += dropArea.frame.origin.x;
origin.y += dropArea.frame.origin.y;
[self initDraggedCellWithCell:cell AtPoint:origin];
cell.highlighted = NO;
if(draggedData != nil)
{
[draggedData release];
draggedData = nil;
}
draggedData = [[dstData objectAtIndex:indexPath.row] retain];
// remove old cell
[dstData removeObjectAtIndex:indexPath.row];
[dstTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
pathFromDstTable = [indexPath retain];
[UIView animateWithDuration:0.2 animations:^
{
CGRect frame = dstTableView.frame;
frame.size.height = kCellHeight * [dstData count];
dstTableView.frame = frame;
}];
}
}
- (void)doDrag:(UIPanGestureRecognizer *)gestureRecognizer
{
if(draggedCell != nil && draggedData != nil)
{
CGPoint translation = [gestureRecognizer translationInView:[draggedCell superview]];
[draggedCell setCenter:CGPointMake([draggedCell center].x + translation.x,
[draggedCell center].y + translation.y)];
[gestureRecognizer setTranslation:CGPointZero inView:[draggedCell superview]];
}
}
- (void)stopDragging:(UIPanGestureRecognizer *)gestureRecognizer
{
if(draggedCell != nil && draggedData != nil)
{
if([gestureRecognizer state] == UIGestureRecognizerStateEnded
&& [dropArea pointInside:[gestureRecognizer locationInView:dropArea] withEvent:nil])
{
NSIndexPath* indexPath = [dstTableView indexPathForRowAtPoint:[gestureRecognizer locationInView:dstTableView]];
if(indexPath != nil)
{
[dstData insertObject:draggedData atIndex:indexPath.row];
[dstTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
}
else
{
[dstData addObject:draggedData];
[dstTableView reloadData];
}
}
else if(!dragFromSource && pathFromDstTable != nil)
{
// insert cell back where it came from
[dstData insertObject:draggedData atIndex:pathFromDstTable.row];
[dstTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:pathFromDstTable] withRowAnimation:UITableViewRowAnimationMiddle];
[pathFromDstTable release];
pathFromDstTable = nil;
}
[UIView animateWithDuration:0.3 animations:^
{
CGRect frame = dstTableView.frame;
frame.size.height = kCellHeight * [dstData count];
dstTableView.frame = frame;
}];
[draggedCell removeFromSuperview];
[draggedCell release];
draggedCell = nil;
[draggedData release];
draggedData = nil;
}
}
#pragma mark -
#pragma mark UITableViewDataSource
- (BOOL)tableView:(UITableView*)tableView canMoveRowAtIndexPath:(NSIndexPath*)indexPath
{
// disable build in reodering functionality
return NO;
}
- (void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
// enable cell deletion for destination table
if([tableView isEqual:dstTableView] && editingStyle == UITableViewCellEditingStyleDelete)
{
[dstData removeObjectAtIndex:indexPath.row];
[dstTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[UIView animateWithDuration:0.2 animations:^
{
CGRect frame = dstTableView.frame;
frame.size.height = kCellHeight * [dstData count];
dstTableView.frame = frame;
}];
}
}
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
// tell our tables how many rows they will have
int count = 0;
if([tableView isEqual:srcTableView])
{
count = [srcData count];
}
else if([tableView isEqual:dstTableView])
{
count = [dstData count];
}
return count;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return kCellHeight;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
UITableViewCell* result = nil;
if([tableView isEqual:srcTableView])
{
result = [self srcTableCellForRowAtIndexPath:indexPath];
}
else if([tableView isEqual:dstTableView])
{
result = [self dstTableCellForRowAtIndexPath:indexPath];
}
return result;
}
#pragma mark -
#pragma mark Helper methods for table stuff
- (UITableViewCell*)srcTableCellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// tell our source table what kind of cell to use and its title for the given row
UITableViewCell *cell = [srcTableView dequeueReusableCellWithIdentifier:kCellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:kCellIdentifier] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.textColor = [UIColor darkGrayColor];
}
cell.textLabel.text = [[srcData objectAtIndex:indexPath.row] description];
return cell;
}
- (UITableViewCell*)dstTableCellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// tell our destination table what kind of cell to use and its title for the given row
UITableViewCell *cell = [dstTableView dequeueReusableCellWithIdentifier:kCellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:kCellIdentifier] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.textColor = [UIColor darkGrayColor];
}
cell.textLabel.text = [[dstData objectAtIndex:indexPath.row] description];
return cell;
}
@end
这是一个如何使用它的例子:
NSArray* srcData = [NSArray arrayWithObjects:@"item0", @"item1", @"item2", @"item3", @"item4", nil];
NSArray* dstData = [NSArray arrayWithObjects:@"item5", @"item6", nil];
dropTable = [[UIDropTableViewController alloc] initWithFrame:CGRectMake(100, 100, 600, 500) SourceData:srcData DestinationData:dstData];
[dropTable setSrcTableTitle:@"Bla"];
[dropTable setDstTableTitle:@"Blub"];
[[dropTable.view layer] setBorderColor:[[UIColor darkGrayColor] CGColor]];
[[dropTable.view layer] setBorderWidth:1];
[[dropTable.view layer] setCornerRadius:2];
[self.view addSubview:dropTable.view];
然后,在您完成编辑后,您只需阅读 dropTable.dstData
并继续使用它来做您想做的事。
在 UIDropTableViewController.m
中,您可能需要根据自己的需要调整 initDraggedCellWithCell
、srcTableCellForRowAtIndexPath
和 dstTableCellForRowAtIndexPath
就细胞表示而言。
关于ios - ipad:将一个 UITableViewCell 从一个 UITableViewController 拖放到另一个 UITableViewController 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6506946/
我是 Swift 开发新手,正在学习许多在线教程。这些教程中的大多数都引用了 Xcode 上的旧版本,并且代码会导致错误。谁能解释为什么下面的代码会产生“UITableViewCell”?无法转换为
我在我的单元格中使用 AutoLayout,但是,当单元格内有大文本并且单元格展开时,单元格似乎与下面的单元格重叠。图像显示了这是如何重叠单元格的: UITableViewCell:
我的函数接受类型为 (cell: UITableViewCell, item: AnyObject) -> () 的函数作为参数。 我的问题是,当我尝试将具有 UITableViewCell 的子类
我正在尝试做一些相当简单的事情,但我看不到最好的方法。我有一个带有两个单元格的 uitableview,第一个在 contextview 中有一个 uitextfield,输入 View 设置为 ui
我在使用 Swift 时遇到了一些挑战。 我有一个带有原型(prototype)单元的 UITableView。有3个单元格前两个包含用户填写的文本字段。第三个包含一个提交按钮。 非常简单! 我的问题
我是 Objective C 的新手。我有一个问题。 我使用自定义的tableviewcell。我正确地使用 JSON 列出了数据。 我想将点击的数据传递到新 View 的自定义表格 View 。 所
我有两个单元格,比方说我的应用程序中的单元格 A 和单元格 B。它们都有自己的类,class CellA : UITableViewCell 和 class CellB : UITableViewCe
我有一个 UIViewController,它根据屏幕上的所需选项实例化一些 UITableViewCell。这些选项之一是“说明”,我创建了一个 .XIB 文件来在屏幕上显示说明。但是,在此屏幕上,
我正在尝试创建一个 tableview,其中有一个 uitableviewcell(cell1) 的子类,其中包含一个按钮等。当在 cell1 中单击该按钮时,该按钮应该在其正下方添加和删除 uita
在使用 UITableView 编码时,我遇到了这个我无法理解的错误。我的表格有 3 行,每行设置 50 像素,但第二行除外,我将其设置为 500 像素,它填满整个屏幕。当我向下滚动到底部时,问题出现
UITableViewCell 反射(reflect)两种不同的状态:突出显示和选定。 对我来说,它们听起来相同,那么到底有什么区别? 最佳答案 突出显示发生在触地时。 选定发生在触摸时,然后调用di
我刚刚添加了屏幕截图。它是定制单元吗?正如我所见,“ map ”是右对齐的,“1800”是左对齐的。我该如何创建它? 最佳答案 它确实看起来像一个自定义单元格。因为 UITableViewCell 继
我不太了解 tableview 的整体行为: 我有一个带有我在 Storyboard中定义的动态单元格(reuseIdentifier:单元格)的表格 View 。除此之外,我还有两个使用两个 nib
我有一个带有以下代码的 UITableViewCell,其中用户单击 UITableViewCell 上的“保存”按钮。单元格中的图像已保存,“保存”按钮动画消失,但单元格仍然存在。 -(UIT
我有一个UITableView,每个单元格都包含一个UIImageView 和一个UIButton。点击按钮后我启动相机,我正在尝试更新该单元格索引路径中的 UIImageView 。到目前为止,这是
有谁知道如何在进入编辑模式时从分组的 UITableView 中隐藏多个单元格?当退出编辑模式时,我希望这些行以动画效果隐藏,就像在“联系人”应用程序中看到的那样。 如您所知,在联系人编辑模式下,行数
我在 UITableViewCell 中有一个 subview ,其中包含一个 UILabel 和一个 UIButton。当我按下按钮时,它出于某种原因取消选择 UITableViewCell。 有没
我一直在经历在 UItableViewCell 中设置 UIDatePicker 的过程,当选择其上方的 UITableViewCell 时会显示该 UIDatePicker,然后在选择 UITabl
我必须集成从代码中以编程方式生成的 UITableViewCell,如下所示: UITableViewCell *newCell = [[UITableViewCell alloc] initWith
我现在正在学习 iOS 开发中的 UITableView 类,我想在导航到多个 UITableViewCells 的部分中实现点击一个 UITableViewCell,该附件类型用于复选标记,我应该怎
我是一名优秀的程序员,十分优秀!