2013-04-03 157 views
2

我有一个HomeViewController它有一个tableView填充数组tableViewArray(最初为空)。当我点击一个barButton时,我模拟地跳到另一个名为OutsideViewController的视图控制器,该视图控制器具有另一个由不同阵列填充的tableView。从另一个视图控制器添加对象到阵列

我想什么做的是以下几点:

当我在OutsideViewController上连续挖掘,我想选择的字符串值添加到tableViewArray这样,当我回去HomeViewController时, tableView具有在tableView中列出的新项目。

到目前为止,这是我曾尝试:

在我OutsideViewController.m我有这样一段代码-didSelectRowAtIndexPath方法:

NSString *selectedRow = [outsideArray objectAtIndex:indexPath.row]; 
NSMutableArray *temporaryArray = [NSMutableArray arrayWithObject:selectedRow]; 

HomeViewController *homeVC = [[HomeViewController alloc] init]; 
homeVC.tableViewArray = temporaryArray; 

该代码的作品,但在的tableView在HomeViewController仍然是空的当我回来。我必须重新加载tableView数据吗? 我正在做对吗?

这是我如何在故事板设置我的视图控制器:

[self dismissViewControllerAnimated:YES completion:^{ }]; 
+0

我使用全局单例类,它可以存储需要从任何控制器访问的数组等东西。 –

回答

4

什么你”:

HomeViewController -(modal segue)-> Navigation Controller --> OutsideViewController 

此外,从OutsideViewController到HomeViewController返回由该行代码完成重新做错了,你正在分配一个新的HomeViewController。我会做的是在您的OutsideViewController中保留对HomeViewController的引用。这是如何。

首先,OutsideViewController.h,创建一个属性,像这样:

@property (nonatomic, weak) HomeViewController *homeVC; 

别忘了在您的m添加在您的.h @class HomeViewController;#import "HomeViewController.h"

HomeViewController,实现prepareForSegue:方法是这样的(更换ModalSegueIdentifier与赛格瑞的标识符):

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"ModalSegueIdentifier"]) { 
     OutsideViewController *modalVC = (OutsideViewController*)segue.destinationViewController; 
     modalVC.homeVC = self; 
    } 
} 

然后,在OutsideViewController.m,而不是做:

HomeViewController *homeVC = [[HomeViewController alloc] init]; 
homeVC.tableViewArray = temporaryArray; 

这样做:

_homeVC.tableViewArray = temporaryArray; 

当你离开模式的VC,你HomeVC将有正确的数组。不要忘记刷新您的UITableView

注意:当然,还有很多其他的方法,它可能不是最好的。但是,它仍然应该起作用。

+0

这工作得很好,我只需要修改行:'OutsideViewController * modalVC =(OutsideViewController *)segue.destinationViewController;'到'OutsideViewController * modalVC =(OutsideViewController *)[segue.destinationViewController topViewController];'因为导航控制器之间的意见 –

+0

很高兴你做到了! – rdurand

1

您也可以使用委托来实现这一点。您必须使用负责将新对象发送到HomeViewController的方法在您的OutsideViewController中创建一个协议。在OutsideViewController.h做到这一点:

@protocol OutsideViewDelegate <NSObject> 
- (void)OutsideViewController:(OutsideViewController *)controller didAddObject:(NSString *)object; 
@end 

在实现文件中,你必须改变一点点didSelectRowAtIndexPath:方法:

NSString *selectedRow = [outsideArray objectAtIndex:indexPath.row]; 
[self.delegate OutsideViewController:self didAddObject:selectedRow]; 

在你HomeViewController.h你必须让你的类符合协议:

@interface HomeViewController : UIViewController <OutsideViewDelegate> 

后,创建用于委托一个属性:

@property (nonatomic, weak) id <OutsideViewDelegate> delegate; 

要完成的过程中,实现在HomeViewController.m协议从OutsideViewController接收新对象:

- (void)OutsideViewController:(OutsideViewController *)controller didAddObject:(NSString *)object 
{ 
    if (object != nil) 
    { 
      [self.tableViewArray addObject:object]; 
    } 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

上述代码取决于,如果你的tableViewArray对象是可变的或没有。如果不是,则可以将协议方法中的对象参数类型更改为不可变数组对象,并将tableViewArray分配给新数组。

编辑:

prepareForSegue:方法不要忘记设置委托:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"SEGUE_IDENTIFIER"]) { 
     OutsideViewController *outsideVC = (OutsideViewController *)[segue destinationViewController]; 
     [outsideVC setDelegate:self]; 
    } 
} 
+0

如果我使用委派,那么我有那个导航控制器之间的视图? –

+0

我认为不是。如果我没有错,代表团使用实现协议方法的viewController。它不应该影响其他控制器。如我错了请纠正我。 – thxou

0

首先确保你allocinittableViewArrayHomeViewController

二,在这一行

HomeViewController *homeVC = [[HomeViewController alloc] init] 

您要创建一个新的引用您的HomeViewController这是不正确的,你需要传递正确的引用,可能在你的OutsideViewController

创建HomeViewController变量即使你做正确的第一和第二个建议,你仍然会看到一个空tableview因为你不重新加载tableview,不知何故你需要发射[self.tableview reloadData];方法。

这意味着;你需要学习代表NSNotifications模式父场景

How do I set up a simple delegate to communicate between two view controllers?

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_nsnotificationcenter/

对于你的问题只是在你的Outside创建委托之间的儿童安全通信>; 在OutsideViewController.h

#import <UIKit/UIKit.h> 

@protocol OutsideDelegate; 

@interface{}//bunch of interface stuff 

// Declare a property for the delegate 
@property (weak) id <OutsideDelegate> delegate; 
@end 

// Protocol Header 
@protocol OutsideDelegate <NSObject> 
@optional 
- (void)dismissPop:(NSMutableArray *)list; 
@end 

在OutsideViewController.m

@synthesize delegate; 


//run delegate method 
[delegate dismissPop:temporaryArray]; 
[self dismissViewControllerAnimated:YES completion:^{ }]; 
在HomeViewController

。^ h

#import "OutsideViewController.h" 
@interface OutsideViewController : UITableViewController<OutsideDelegate> 
{} 
@property (strong, nonatomic) OutsideViewController *pvc; 

在HomeViewController.m

@synthesize pvc; 

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

    if ([[segue identifier] isEqualToString:@"your segue"]) { 
     pvc = [segue destinationViewController]; 
     [pvc setDelegate:self]; 
    } 
} 
// delegate callback function 

- (void)dismissPop:(NSMutableArray *)list { 

    self.tableViewArray=list; 
    [self.tableView reloadData]; 
} 

另一个解决方案是

视图栈改成这样:

Navigation Controller --> HomeViewController -(push segue)--> OutsideViewController 

和应用rdurand的回答

,并添加到您的HomeViewController:

-(void)viewDidAppear:(BOOL)animated 
{ 
    [self.tableview reloadData]; 
} 

在这个解决方案,因为你,当你弹出OutsideViewController处于nabigation堆栈viewDidAppear只是把流行viewcontrollers将在HomeViewController每次调用。

+0

如果我使用委托,是否有关于我之间的视图导航控制器? –

+0

nope它不应该问题,它不工作检查委托'设置正确我还没有测试代码,但我也更新了我的答案与一个额外的解决方案,你需要尽快学习委托和nsnotification –

相关问题