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

时间:2013-09-28 20:28:15

标签: ios objective-c uitableview

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

这是list-tableview中的一些代码(推送'Done'时传递数据)。 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方法找到了解决方案。 任何有类似问题的人都可以查看这些链接:

如何解开segue: What are Unwind segues for and how do you use them?

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

2 个答案:

答案 0 :(得分:0)

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

您希望Master表视图控制器接收用户从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 完成完成按钮将连接到:

-(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];
    }
}

答案 1 :(得分:-1)

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

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

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

阅读代表和协议。

Delegates and Datasources

Protocols