Iphone 将对象返回到根viewcontroller

Iphone 将对象返回到根viewcontroller,iphone,objective-c,ios,uiviewcontroller,Iphone,Objective C,Ios,Uiviewcontroller,我知道这个话题已经在很多地方被讨论过了,但是在讨论不同的答案时,我找不到一个适合我的情况的解决方案 基本上我想做的很简单。我有一个带有表视图的视图控制器,还有一个+按钮,它触发第二个视图控制器,用户可以在其中输入(比如名称),然后将该名称添加到第一个视图控制器表视图中。想想iPhone上的联系人,你可以在那里添加一个新的联系人(或者亚马逊,你可以在那里添加一张新的信用卡) 我的问题是-将这个字符串(在本例中)返回到表所在的视图控制器的最佳方式是什么 人们建议使用NSDefaults、Delega

我知道这个话题已经在很多地方被讨论过了,但是在讨论不同的答案时,我找不到一个适合我的情况的解决方案

基本上我想做的很简单。我有一个带有表视图的视图控制器,还有一个+按钮,它触发第二个视图控制器,用户可以在其中输入(比如名称),然后将该名称添加到第一个视图控制器表视图中。想想iPhone上的联系人,你可以在那里添加一个新的联系人(或者亚马逊,你可以在那里添加一张新的信用卡)

我的问题是-将这个字符串(在本例中)返回到表所在的视图控制器的最佳方式是什么

人们建议使用NSDefaults、Delegate或singleton,这些都不适合这种情况(每个都有自己的原因)。我只需要返回一个简单的字符串


谢谢你的帮助

您不会将新内容返回到TableView。您需要的是更新提供给tableView的信息源。
因此,数据所在的位置是您需要前往并添加它的位置,当您返回UITableViewController时,您可能需要告诉UITableView重新加载它的数据

如果您绝对需要与之通信,则每个连接到其父级的连接上都有一个句柄

UIViewController *parentVC = aViewController.parentViewController;

您不会将新事物返回到TableView。您需要的是更新提供给tableView的信息源。
因此,数据所在的位置是您需要前往并添加它的位置,当您返回UITableViewController时,您可能需要告诉UITableView重新加载它的数据

如果您绝对需要与之通信,则每个连接到其父级的连接上都有一个句柄

UIViewController *parentVC = aViewController.parentViewController;

如果您是从视图控制器A->视图控制器B导航的,这里就是您的例子,然后您想从B->A传递信息,建议使用松耦合,如委派。正如您所讨论的,有两件事情,比如NSUserDefaults、singleton、NSNotification,可能还有更多


但是委派是更好的标准方法。

如果您是从视图控制器A导航-->视图控制器B(这里就是您的例子),然后希望从B->A传递信息,建议使用松耦合,如委派。正如您所讨论的,有两件事情,比如NSUserDefaults、singleton、NSNotification,可能还有更多


但委派是更好的标准方法。

假设需要更新的ViewController是应用程序的根视图控制器,您可以执行以下操作:

YourViewController*yvc=[(YourAppDelegate*)[[UIApplication sharedApplication]委托]viewController]

[yvc updateString:@“更新字符串”]

记住:

#import "YourAppDelegate.h"

但老实说,我会使用委托模式或NSNotification。

假设需要更新的ViewController是应用程序的根视图控制器,您可以执行以下操作:

YourViewController*yvc=[(YourAppDelegate*)[[UIApplication sharedApplication]委托]viewController]

[yvc updateString:@“更新字符串”]

记住:

#import "YourAppDelegate.h"
但老实说,我会使用委托模式或NSNotification。

三个好选项:

1)让第一个视图控制器将自身传递给第二个视图控制器,,以便第二个控制器可以向第一个视图控制器发送消息。理想情况下,创建第一个控制器采用的协议,以便第二个控制器不依赖于第一个控制器的类型,而只关心它实现协议:

@protocol Nameable
@property(copy) NSString* name;
@end;

@interface FirstViewController <Nameable>
//...
@end

@implementation FirstViewController
@synthesize name;
//...
@end
当时间到来时,第二个控制器可以执行以下操作:

SecondViewController *second = [[SecondViewController alloc]
initWithNibName:nil]; second.thingToName = self;
[self.navigationController pushViewController:second animated:YES];
self.thingToName.name = nameString;
细节其实并不那么重要——这里要知道的主要一点是,如果要向对象发送消息,首先需要一个指向该对象的指针。当第一个视图控制器设置second.thingToName=self时,它提供了该指针

2)让第一个视图控制器创建一个数据对象,第二个视图控制器可以在其中存储数据,如下所示:

@interface Person <Nameable>
//...
@end

@implementation Person
@synthesize name;
//...
@end
@implementation FirstViewController
//...

- (IBAction)addNewName:(id)sender
{
    self.secondController = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
    [self.navigationController pushViewController:self.secondController animated:YES];
}

- (void)viewWillAppear
{
    if (self.secondController != nil) { // we must be returning from the child
        self.name = self.secondController.name;
        self.secondController = nil;
    }
}
@end
这与第一种方法类似,只是接收名称的不是这里的视图控制器,而是某种数据容器(Person)

您也可以在这里看到协议的价值——请注意,SecondViewController类在第一种和第二种方法之间根本没有变化。它不在乎它是在与视图控制器、Person实例还是其他任何东西交谈。。。只要它实现了可命名协议,它就很高兴

3)反转通信方向。让其父视图控制器获取字符串,而不是让第二视图控制器发送字符串。这可能是最简单的解决方案,尽管它确实需要父母有某种方式知道孩子已经完成了。大概是这样的:

@interface Person <Nameable>
//...
@end

@implementation Person
@synthesize name;
//...
@end
@implementation FirstViewController
//...

- (IBAction)addNewName:(id)sender
{
    self.secondController = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
    [self.navigationController pushViewController:self.secondController animated:YES];
}

- (void)viewWillAppear
{
    if (self.secondController != nil) { // we must be returning from the child
        self.name = self.secondController.name;
        self.secondController = nil;
    }
}
@end
三个好的选择:

1)让第一个视图控制器将自身传递给第二个视图控制器,,以便第二个控制器可以向第一个视图控制器发送消息。理想情况下,创建第一个控制器采用的协议,以便第二个控制器不依赖于第一个控制器的类型,而只关心它实现协议:

@protocol Nameable
@property(copy) NSString* name;
@end;

@interface FirstViewController <Nameable>
//...
@end

@implementation FirstViewController
@synthesize name;
//...
@end
当时间到来时,第二个控制器可以执行以下操作:

SecondViewController *second = [[SecondViewController alloc]
initWithNibName:nil]; second.thingToName = self;
[self.navigationController pushViewController:second animated:YES];
self.thingToName.name = nameString;
细节其实并不那么重要——这里要知道的主要一点是,如果要向对象发送消息,首先需要一个指向该对象的指针。当第一个视图控制器设置second.thingToName=self时,它提供了该指针

2)让第一个视图控制器创建一个数据对象,第二个视图控制器可以在其中存储数据,如下所示:

@interface Person <Nameable>
//...
@end

@implementation Person
@synthesize name;
//...
@end
@implementation FirstViewController
//...

- (IBAction)addNewName:(id)sender
{
    self.secondController = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
    [self.navigationController pushViewController:self.secondController animated:YES];
}

- (void)viewWillAppear
{
    if (self.secondController != nil) { // we must be returning from the child
        self.name = self.secondController.name;
        self.secondController = nil;
    }
}
@end
这与第一种方法类似,只是接收名称的对象不是