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