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 是一个 Choice 或 Selection 表视图控制器,它允许用户选择将在主表视图控制器中显示的媒体类型。
您希望主表视图控制器接收用户从 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 Done 或 Complete 按钮将连接到:
-(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() 如何正确重新加载数据?