tableview 不会从第二类正确重新加载

Posted

技术标签:

【中文标题】tableview 不会从第二类正确重新加载【英文标题】:tableview won't reload properly from second class 【发布时间】:2013-09-28 20:28:14 【问题描述】:

我正在创建一个新应用程序,并且在应用程序中我想要两个表格视图。一个用于显示列表,另一个用于显示用户从列表中选择的内容。 到目前为止,我已经创建了包含项目的数组,并且我已经让视图在彼此之间传递。 我似乎无法在另一个 tableview 中显示所选项目。

这是来自列表表视图的一些代码(数据在推送“完成”时传递)。 viewC 是另一个视图的实例,用于访问它。

-(IBAction)dismissValgScene 
for (int i = 0; i < ValgteMedierarray.count; i++) 
    NSLog(@"%@", [ValgteMedierarray objectAtIndex:i]);

viewC.TilvalgteMedierArray = [NSMutableArray arrayWithArray:ValgteMedierarray];
NSLog(@"1: antal i tilvalgteArray = %lu", (unsigned long)viewC.TilvalgteMedierArray.count);
[viewC.tableView reloadData];
NSLog(@"2: antal i tilvalgteArray = %lu", (unsigned long)viewC.TilvalgteMedierArray.count);
[self dismissViewControllerAnimated:YES completion:nil];

这是完成按钮的方法,它将所选项目添加到另一个视图中的数组中。 (也就是viewC.TilvalgteMedierArray)

这是另一个视图中的一些代码,应该显示所选项目

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

// Return the number of rows in the section.
return [TilvalgteMedierArray count];

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

if (!cell) 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];


// Configure the cell...
cell.textLabel.text = [TilvalgteMedierArray objectAtIndex:indexPath.row];

return cell;

希望你们能提供帮助,如果你对我的编码有任何不理解的地方,请让我详细说明 :)

(如果这已在其他地方得到回答,我表示歉意,但我一直在寻找几个小时没有找到解决方案)。


编辑:

感谢所有试图帮助我的人。 :)

我现在找到了使用 Unwind Segue 方法的解决方案。 任何有类似问题的人都可以查看这些链接:

如何进行放松转场: What are Unwind segues for and how do you use them?

如何使用 unwind segue 传递数据: ios 6 - can i return data when i unwind a segue?

【问题讨论】:

[NSMutableArray arrayWithArray:ValgteMedierarray]; 最好是[NSMutableArray arrayWithArray:[ValgteMedierarray copy]];,因为arrayWithArray: 方法不期望数组的可变版本。 你已经做了哪些调试?您是否已验证 viewC.TilvalgteMedierArray 包含项目?你检查过每个表的委托方法的返回值吗? @JörgKirchhof 不,你错了。 [NSMutableArray arrayWithArray:ValgteMedierarray] 非常好。试试看。 当然可以——但它不是好的编码风格。 API 要求他提供NSArray,他提供了NSMutableArray。调用 copy 强制 NSMutableArray 提供自身的不可变版本。 @TimothyMoose 我已经验证viewC.TilvalgteMedierArray确实包含项目。不过,我还没有做过委托的事情。我应该在其中寻找什么? 【参考方案1】:

您的 ValgViewController 是一个 ChoiceSelection 表视图控制器,它允许用户选择将在主表视图控制器中显示的媒体类型。

您希望主表视图控制器接收用户从 ValgViewController 中选择的一系列选项。

为此,需要在 ValgViewController 标头中定义委托协议,并让主表视图控制器符合该协议。

例如,您将在 ValgViewController 头文件中添加以下内容:

@protocol ValgViewControllerDelegate <NSObject>
-(void)syncChoicesWithArray:(NSArray *)arrayToSync;
@end

@interface ValgViewController : UITableViewController
@property (nonatomic, assign) id <ValgViewControllerDelegate> delegate;
@property (nonatomic, strong) NSMutableArray *MedieValgListeArray, *ValgteMedierarray;
@end

在 ValgViewController.m 中,ValgViewController DoneComplete 按钮将连接到:

-(IBAction)actionSelectionCompleted:(id)sender 

    [self.delegate syncChoicesWithArray:ValgteMedierarray];
    // [mc.self sync:ValgteMedierarray];
    // [self dismissViewControllerAnimated:YES completion:nil];


在您的 MasterViewController.m 文件中,您可以让 MasterViewController 通过添加以下内容来采用协议:

@interface MasterViewController () <ValgViewControllerDelegate>
    // no need for this if performing segues
    // ValgViewController *valgV;

@end

然后通过以下方式实现委托协议:

#pragma mark - ValgViewController Delegate methods

-(void)syncChoicesWithArray:(NSArray *)arrayToSync
    // Dismiss the ValgViewController model from here
    [self dismissViewControllerAnimated:YES completion:nil];

    TilvalgteArray = arrayToSync;
    NSLog(@"valgte = %i", arrayToSync.count);
    NSLog(@"tilvalgte = %i", TilvalgteArray.count);
    NSLog(@"%@", [TilvalgteArray objectAtIndex:0]);
    [self.tableView reloadData];


在 prepareForSegue 方法中添加 Master 表视图控制器作为 ValgViewController 的委托:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([segue.identifier isEqualToString: @"showTilvalgteMedierScene"])
    
        ValgViewController *vc = [segue destinationViewController];
        vc.delegate = self;
        vc.TilvalgteMedierArray = [NSMutableArray arrayWithArray:ValgteMedierarray];
    

【讨论】:

使用此方法,应用程序只会将大量视图堆叠在一起。我必须使用[self dismissViewControllerAnimated:YES completion:nil];,据我所知,我不能在情节提要的转场中这样做。 哪个是Master表视图控制器,哪个是Detail表视图控制器?目前还不清楚。您是否尝试从dismissValgScene 操作方法调用Detail 控制器?如果是这样,那你为什么还要解散主控制器? 请检查我对主帖的编辑。我已经为你提出了我的项目。【参考方案2】:

我敢打赌,这里缺少的是正确的协议/委托模式。

您指的是另一个视图中的数组和属性,您不应该干预。限制每个视图管理自己的事务。

创建一个协议,使初始视图成为委托,响应选择的更改或 doneTouched。因此,本质上,您的选择视图将仅监视和修改选择,并在进行更改或完成时向感兴趣的人报告。这个视图不应该知道或关心委托从那里做什么。

阅读委托和协议。

Delegates and Datasources

Protocols

【讨论】:

以上是关于tableview 不会从第二类正确重新加载的主要内容,如果未能解决你的问题,请参考以下文章

如何将选定的值从第二类发送到 iPhone 中的第一类 indexpath.row

tableView.reloadData() 如何正确重新加载数据?

Swift - 第二次加载后 Tableview 无法正确重新加载

未在 TableView 中重新加载正确的数据

选择行后Tableview不会重新加载数据

更改数据和 popViewController 后 TableView 不会重新加载