如何将选定的行从一个UITableView复制到另一个?

时间:2014-09-26 12:19:16

标签: ios objective-c iphone uitableview

我有两个viewcontrollers,两个都有tableview。第一个viewcontroller有一个图像,每行有一个标题,而另一个有空行。我想要的是能够复制第一个视图控制器中所选行的内容,并将它们粘贴到第二个视图控制器的空行中。

这是.m文件:

#import "SimpleTableViewController.h"

@interface SimpleTableViewController ()

@end


@implementation SimpleTableViewController
{
    NSArray *list;

}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    list = [NSArray arrayWithObjects:@"Pic 1", @"Pic 2", @"Pic 3", @"Pic 4", @"Pic 5", nil];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return [list count];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   static NSString *simpleTableIndentifier= @"simpleTableCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIndentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIndentifier];

            }
    cell.textLabel.text = [list objectAtIndex:indexPath.row];
    cell.imageView.image = [UIImage imageNamed:@"image.jpg"];
    return cell;

}

@end

我是UITableView的新手,所以我这样做是为了学习目的。

谢谢

3 个答案:

答案 0 :(得分:1)

我要做的是创建一个新的NSMutableArray,用于存储所选单元格的值,然后将该数组作为其数据源传递给新表。

像这样:

@implementation SimpleTableViewController
{
    NSArray *list;
    NSMutableNArray *selectedCells; // store the selected cells here

}

- (void)viewDidLoad
{

    // .... your code here

    // initialize your selected cells array
    selectedCells = [[NSMutableArray alloc] init];
}

现在使用didSelectRowAtIndexPath方法,您可以通过UITableViewDelegate获取所选的行数据:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath   
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSString *cellText = cell.textLabel.text;
    UIImage *imageView = cell.imageView.image;
    // Now add whatever you want to your selectedCells array now 
    // that you have a reference to the selected cell.
}

通过这样的简单设置,您现在可以将selectedCells数组作为数据源传递给新的tableView。

希望这会有所帮助。我没有测试过代码,所以它只是指向正确的方向。

答案 1 :(得分:1)

你可以得到如下所选的行: -

//First TableViewController
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath   
{
   secondTableViewObj = [[SecondTableView alloc]initWithNibName:@"SecondTableView" bundle:nil];
   secondTableViewObj.dict = [NSDictionary dictionaryWithObjectsAndKeys:@"test",@"title",@"test2",@"detail", nil];

   secondTableViewObj.pass_img = [UIImage imageNamed:@"Icon"];

   //Alternative of this would be to use segue and do all passing of object's in prepareForSegue method but don't forget to put identifier.
   [self.navigationController pushViewController:next animated:YES];
   [tableView deselectRowAtIndexPath:indexPath animated:NO];
}

//Second TableViewController
In SecondTableView.h file

#import <UIKit/UIKit.h>

@interface NewViewController : UIViewController

@property (assign) UIImage *pass_img;
@property (nonatomic, retain) NSDictionary *dict;
@end

In SecondTableViewCon.m file

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *identtifier =@"yourCellIndentifier";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identtifier];

  if(cell==nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identtifier];
   }

    //You need to provide tag value to your component in your xib/storyboard and set them with value's as below.
    UILabel *cellTitleLabel = (UILabel *)[cell viewWithTag:0];
    UILabel *cellDetailLabel = (UILabel *)[cell viewWithTag:1];
    UIImage *cellImg = (UIImage *)[cell viewWithTag:2];

   cellTitleLabel.text = [dict objectForKey:@"title"];
   cellDetailLabel.text = [dict objectForKey:@"detail"];
   cellImg = img;

   return cell;
  }   

其他任何事情都让我知道。

答案 2 :(得分:0)

首先,这是您可能想要的答案:

使用indexPathsForSelectedRows。在您从复制的视图控制器中,您必须实现cellForRowAtIndexPath,因此indexPathsForSelectedRows在某种程度上可以成为“反向”的一部分。如果您知道索引路径与数据集的某个成员是1:1(并且您很有可能),那么调用indexPathsForSelectedRows可以通过获取索引路径并查找关联数据来获取所需的数据成员。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 ...
 cell.textLabel.text = ((MyClass *)self.myDataSet[indexPath.row]).someTextProperty;
 ...
}

- (void)copyRowsToTableViewB {
    for (NSIndexPath path in self.indexPathsForSelectedRows) {
         // Add to table B's datasource and re render
         [tableBDataSource.someMutableArrayMaybe addObject:self.myDataSet[indexPath.row]
    }
}

现在,复制数据而不是视图内容会更好更容易。例如,创建一个SimpleTableViewDataSourceAndDelegate来实现委托&amp;给定适当的服务/ ORM /任何依赖的数据源协议。

@interface SimpleTableViewDataSourceAndDelegate : NSObject<UITableViewDelegate, UITableViewDataSource>

...

@interface UIViewControllerA : UIViewController<UITableViewDelegate, UITableViewDataSource>
- (id) initWithBaseDelegate:(NSOjbect<UITableViewDelegate> *) baseDelegate dataSource:(NSObject<UITableViewDataSource> *)baseDataSource

这将允许他们在填充数据源时共享被引用的同一对象。