如何从数组中过滤多个选定值并将其从 uibutton 加载到其他 uitableview

Posted

技术标签:

【中文标题】如何从数组中过滤多个选定值并将其从 uibutton 加载到其他 uitableview【英文标题】:How to filter the multiple selected values from an array and load it to other uitableview from a uibutton 【发布时间】:2016-10-28 04:37:15 【问题描述】:

我在 UiViewController 中有 2 个 UiTableview。我的确切要求是通过点击添加按钮从 tableview1 中获取选定的值并加载到 tableview2。

我现在完成了关注 1. 将 JSON 响应加载到 tableview1(此时从文件路径加载响应)并打印到自定义 nib 单元格 2.我可以得到选择的值回复如下 下一个 3. 我想从选定的值中将该值打印到 *cell2。请详细说明接下来的步骤。

这是用户界面 Main UI and Description

这里是从表格加载到选择的代码。

对象 - PSAData.h

@interface PSAData : NSObject

@property (nonatomic, strong) NSString *firstname;
@property (nonatomic, strong) NSString *lastname;

- (void)loadWithDictionary:(NSDictionary *)dict;

@end

对象 - PSAData.m

@implementation PSAData

- (void)loadWithDictionary:(NSDictionary *)dict

    self.firstname=[dict objectForKey:@"firstname"];
    self.lastname=[dict objectForKey:@"lastname"];      

table1 Viewcell - PSATableViewCell.h

#import <UIKit/UIKit.h>
#import "PSAData.h"
#import "NetworkConnectivityClass.h"
@interface PSATableViewCell : UITableViewCell

@property (nonatomic) NetworkConnectivityClass *networkConnectivityClassInstance;

-(void)loadWithData:(PSAData *)psaData;
@end

table1 视单元 - PSATableViewCell.m

@interface PSATableViewCell ()
@property (strong, nonatomic) IBOutlet UILabel *firstnameLbl;
@property (strong, nonatomic) IBOutlet UILabel *lastnameLbl;


@end

@implementation PSATableViewCell

- (void)awakeFromNib 
    [super awakeFromNib];
    // Initialization code


- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
    [super setSelected:selected animated:animated];




-(void)loadWithData:(PSAData *)psaData

    [self methodSetupText:psaData];


-(void)methodSetupText:(PSAData *)psaData

    self.firstnameLbl.text=psaData.firstname;
    self.lastnameLbl.text=psaData.lastname;


@end

主视图控制器 - PersonnelViewController

- (void)viewDidLoad 
    [super viewDidLoad];


   //   NSMutableArray *selectedArray=[[NSMutableArray alloc]init];

    tableView1.dataSource =self;
    tableView1.delegate=self;
    tableView2.dataSource=self;
    tableView2.delegate=self;

    //initializing arrays for get selected values
    self.selectedCells=[NSMutableArray array];
    self.selectedPSAData=[NSMutableArray array];

    //loading web resonse data
    self.loadedPSAData=[[NSMutableArray alloc]init];

     NetworkConnectivityClass *networkConnectivityClassInstance = [NetworkConnectivityClass new];

    __weak PersonnelViewController *weakVersionOfSelf=self;

  [networkConnectivityClassInstance methodReturnTableViewMessages:^(NSMutableArray *returnedArrayWithMessages)
   
       weakVersionOfSelf.loadedPSAData=returnedArrayWithMessages;
       [weakVersionOfSelf.tableView1 reloadData];

   ];
    //register left side tableview cell (Assigned tableview1)
    [self.tableView1 registerNib:[UINib nibWithNibName:@"PSATableViewCell" bundle:nil] forCellReuseIdentifier:@"PSATableViewCell"];


//tableview 代表

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 

        if(tableView ==self.tableView1)
        
            return 1;
        
        return 1; 
    

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

        if(tableView==self.tableView1)
        

            return self.loadedPSAData.count;

        
        return self.loadedPSAData.count;
    

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


    //loading table data into cell tableview1 and tableview2
    static NSString *cellIdentifier=@"PSATableViewCell";

    PSATableViewCell *cell=[tableView1 dequeueReusableCellWithIdentifier:cellIdentifier];


    if (cell==nil) 

        cell=[[PSATableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"PSATableViewCell"];
    



    //tableview2 implementation
    static NSString *cellIdentifier2=@"PSSITableViewCell";

    PSSITableViewCell *cell2=[tableView2 dequeueReusableCellWithIdentifier:cellIdentifier2];

    if (cell2==nil)  
        cell2=[[PSSITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"PSSITableViewCell"];
     
    cell.accessoryType = ([self isRowSelectedOnTableView:tableView1 atIndexPath:indexPath]) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;

    if(tableView == self.tableView1)
    
        [cell loadWithData:[self.loadedPSAData objectAtIndex:[indexPath row]]]; 
    
    else if(tableView == self.tableView2)
    
        [cell2 loadWithDataS2:[self.loadedPSAData objectAtIndex:[indexPath row]]];
        return cell2;
    

    return cell;
    

pragma mark - 多选

- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    NSString *psaData =[self.loadedPSAData objectAtIndex:indexPath.row];
    PSATableViewCell *cell=[tableView1 cellForRowAtIndexPath:indexPath];


    NSString *sampleAH =[self.selectedPSAData description];

    if([self isRowSelectedOnTableView:tableView1 atIndexPath:indexPath])
    
        [self.selectedCells removeObject:indexPath];
        [self.selectedPSAData removeObject:psaData];

        cell.accessoryType =UITableViewCellAccessoryNone;
    
    else
        [self.selectedCells addObject:indexPath];
        [self.selectedPSAData addObject:psaData];

        cell.accessoryType =UITableViewCellAccessoryCheckmark;

    

    NSLog(@"%@", self.selectedPSAData);


    sampleArrayholder.text=[NSString stringWithFormat:@"%@", sampleAH];



-(BOOL)isRowSelectedOnTableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath

    return ([self.selectedCells containsObject:indexPath]) ? YES : NO;

**最后是 NetworkConnectivity 类 - NetworkConnectivityClass.h **

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "WorksitenameList.h"

@interface NetworkConnectivityClass : NSObject

-(void)methodLogin:(NSString *)stringToLogin withUserName:(NSString *)stringUsername withPassword:(NSString *)stringPassword completion:(void(^)(NSDictionary *))completion;


-(void)methodReturnTableViewMessages:(void (^)(NSMutableArray *))completion;


-(NSURLSessionTaskState)methodCheckIfSessionIsRunning;

-(void)methodCancelNetworkRequest;

@结束

**最后是 NetworkConnectivity 类 - NetworkConnectivityClass.m **

-(void)methodReturnTableViewMessages:(void (^)(NSMutableArray *))completion

    dispatch_queue_t queueForJSON = dispatch_queue_create("queueForJSON", NULL);
    dispatch_async(queueForJSON, ^
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"PSAData" ofType:@"json"];

        NSError *error = nil;

        NSData *rawData = [NSData dataWithContentsOfFile:filePath options:NSDataReadingMappedIfSafe error:&error];

        id JSONData = [NSJSONSerialization JSONObjectWithData:rawData options:NSJSONReadingAllowFragments error:&error];

        NSMutableArray *loadedPSAData = [NSMutableArray new];
        [loadedPSAData removeAllObjects];

        if([JSONData isKindOfClass:[NSDictionary class]])
        
            NSArray *loadedArray=[JSONData objectForKey:@"records"];
            if([loadedArray isKindOfClass:[NSArray class]])
            
              for(NSDictionary *psaDict in loadedArray)
              
                  PSAData *psaData=[[PSAData alloc]init];
                  [psaData loadWithDictionary:psaDict];
                  [loadedPSAData addObject:psaData];
              

            
        
        dispatch_async(dispatch_get_main_queue(), ^
            completion(loadedPSAData);
            NSLog(@"test: %@", loadedPSAData);
        );
    );


我添加了所有必需的代码来查看它。因为我对 ios Dev 比较陌生。请逐步清楚地编写代码/说明以节省一些时间:)。

**请注意:目前我将相同的 tableview1 数据加载到 tableview2 *cell2 但我想在这里加载选定的值(多选)。通过点击添加按钮,从 tableview1 加载PSAData Array 加载到表视图中。最后对不起我的英语不好;) **

【问题讨论】:

您想将选定的值显示到下一个屏幕(tableview 2)?. 您能否添加您想要实现的摘要?如果您想在 Next 屏幕中显示选定的值,您可以通过隐含单元格 Indexpath 的逻辑来维护选定数据的数组,然后您可以将该数组传递给 Next 控制器 @Signare 是的,我想将选定的值显示到 tableview2,但它不在下一个屏幕中。它在同一个屏幕上。 (我会尽快编辑帖子并添加 UI 屏幕截图)。 @Wolverine 我找到了几种使用 segue 将选定值从 *selected 数组传递到下一个屏幕的方法。但是这里我们没有导航控制器或 segues 来传递,因为 tableview2 在同一个 UIViewController 中。请帮帮我。 嗨@Signare 我通过编辑添加了主用户界面和描述,请尽快查看并支持我。 【参考方案1】:

假设这 2 个是您的餐桌插座。

__weak IBOutlet UITableView * myTable1;
__weak IBOutlet UITableView * myTable2;

您在 viewDidLoad 中设置委托和数据源,如下所示

myTable1.delegate=self;
myTable1.dataSource=self;
myTable2.delegate=self;
myTable2.dataSource=self;

现在这是 2 个数组

array1 ==> Which contain All Data
arraySelectedValues ==> Which contain you selected data

所以你像下面这样使用它

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

    if(self.myTable1 == tableView) 
    
        return [array1 count];        
     else 
        return [arraySelectedValues count];
    

当我查看您的代码时,您的问题可能出在 CellForRow 中。当有相同的 CellIdentifier 时,为什么要创建 2 个单独的单元格。您只需要更改数据。

当两个 Tableview 都使用 Diff-Diff tableviewcells 时,您应该创建 2 个单元格。在您的情况下,您使用的是同一个单元格。

尝试像这样修改代码

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

    static NSString *cellIdentifier=@"PSATableViewCell";

    PSATableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell==nil) 

        cell=[[PSATableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier: cellIdentifier];
    

if(tableView == myTable1)

    [cell loadWithData:[array1 objectAtIndex:[indexPath row]]]; 

else if(tableView == myTable2)

    [cell loadWithData:[arraySelectedValues objectAtIndex:[indexPath row]]];

return cell;


didSelectRowAtIndexPath 应如下所示:

- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

 if(tableView == myTable1)
 
  // Your code for highlighting
  else 
  // This will be you myTable2 did select click.
     

当你想刷新记录时,你应该为各自的 Tableview 调用 ReloadData 方法。

希望您了解如何在 Single ViewController 的 2 个 Tableview 中加载数据。

【讨论】:

很好的答案,它有效!谢谢@Wolverine。但是当我选择并将数据添加到 tableview2 时,它也通过了一些复选标记。如何在不点击任何内容的情况下删除 tableview2 中的复选标记? 在“cellForRow”中,可以设置“cell.accessoryType =UITableViewCellAccessoryNone;”为您的 tableview2. 在应用复选标记时,还应用“didSelect”方法上的表格视图比较。应该只对 Tableview1 进行。

以上是关于如何从数组中过滤多个选定值并将其从 uibutton 加载到其他 uitableview的主要内容,如果未能解决你的问题,请参考以下文章

如何快速从选定的tableviewcell中过滤数组?

如何从数据库特定的选定值添加到解码的 Json 数组

如何遍历对象数组并将值放入过滤器?

使用Javascript比较(过滤)动态数组中的多个数组值

过滤数据集并将其从 SQL 服务器读取到 R

如何在 PHAsset 中添加图像并将其从照片库中删除?