0

我正在创建一个新应用程序,并且在应用程序中我想要两个表格视图。一个用于显示列表,另一个用于显示用户从列表中选择的内容。到目前为止,我已经创建了包含项目的数组,并且我已经让视图在彼此之间传递。我似乎无法在另一个 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 方法找到了解决方案。任何有类似问题的人都可以查看这些链接:

如何制作展开转场:展开 转场的用途是什么以及如何使用它们?

如何通过展开转场传递数据: iOS 6 - 我可以在展开转场时返回数据吗?

4

2 回答 2

0

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

您希望主表视图控制器接收用户从 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];
    }
}
于 2013-09-29T03:27:46.037 回答
-1

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

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

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

阅读代表和协议。

代表和数据源

协议

于 2013-09-29T11:57:59.217 回答