3

我有HomeViewController一个 tableView 填充了数组tableViewArray(最初是空的)。当我点击 barButton 时,我模态地转到另一个视图控制器OutsideViewController,该控制器具有另一个由不同数组填充的 tableView。

我想做的是以下几点:

当我点击 中的一行时OutsideViewController,我想将选定的字符串值添加到 中,tableViewArray这样当我返回时HomeViewController,tableView 会在 tableView 中列出该新项目。

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

在我的-didSelectRowAtIndexPath方法中,我OutsideViewController.m有这段代码:

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

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

该代码有效,HomeViewController但当我返回时,tableView 仍然是空的。我是否必须重新加载 tableView 数据?我这样做对吗?

这就是我在 Storyboard 中设置视图控制器的方式:

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

另外,OutsideViewController 到 HomeViewController 的返回是通过这行代码完成的:

[self dismissViewControllerAnimated:YES completion:^{ }];
4

3 回答 3

4

你做错了什么是你分配了一个新的HomeViewController. 我会做的是HomeViewController在你的OutsideViewController. 这里是如何。

首先,在 中OutsideViewController.h,创建一个属性,如下所示:

@property (nonatomic, weak) HomeViewController *homeVC;

不要忘记添加@class HomeViewController;您的 .h 和#import "HomeViewController.h".m

HomeViewController中,实现这样的prepareForSegue:方法(将ModalSegueIdentifier替换为您的 segue 标识符):

- (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

NB:当然,还有很多其他方法,它可能不是最好的方法。但是,它应该可以工作。

于 2013-04-03T13:58:47.917 回答
1

您也可以使用委托来实现这一点。您必须OutsideViewController使用负责将新对象发送到您的HomeViewController. 在 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];
    }
}
于 2013-04-03T14:14:06.990 回答
0

首先确定你allocinittableViewArrayHomeViewController

二、在这一行

HomeViewController *homeVC = [[HomeViewController alloc] init]

您正在创建一个HomeViewController不正确的新引用,您需要传递正确的引用,可能会在您的 HomeViewController 中创建变量 OutsideViewController

即使您正确地执行了第一个和第二个建议,您仍然会看到一个空的 tableview,因为您没有重新加载 tableview,不知何故您需要触发[self.tableview reloadData];方法。

这意味着;您需要学习DelegateNSNotifications模式以在 child->parent 场景之间进行通信

如何设置一个简单的委托来在两个视图控制器之间进行通信?

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

在这个解决方案中,因为你只是一个 nabigation 堆栈中的推送视图控制器viewDidAppear,所以每次你弹出 OutsideViewController 时都会在 HomeViewController 中调用。

于 2013-04-03T14:17:31.313 回答