4

我能够毫无问题地将数据从一个视图传递到另一个视图。但这是我面临的问题。

假设 ->将数据传递给其他视图

ViewA->ViewB This working perfectly fine 
ViewB->ViewC This working perfectly fine
ViewC->ViewB Here is the problem.

我尝试使用push segue,它进入ViewB,但是当我按下返回按钮时,它进入ViewC->返回按钮->ViewB->返回按钮->View A。当我按下返回按钮时,它必须从ViewB进入ViewA。

尝试使用modal segue,它转到 ViewB 但我不能去任何地方。

由于我是 iOs 的新手,我真的不知道如何实现这一目标?

如何将数据从 ViewC 传回 ViewB?

我想你们可以帮助我。

编辑

在视图 A 中,我像这样调用 ViewB

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"RemixScreen"])
{

    if([self.recipeFrom isEqualToString:@"ViewB"])
    {

        ViewB *reciepe = [segue destinationViewController];
        //somedata i will pass here

    }  
}
 }

在视图 B 我这样打电话

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
if([segue.identifier isEqualToString:@"ViewA"])
{  
    ViewA *data = [segue destinationViewController];
    //some data  
}
}

谢谢你们的帮助。

4

3 回答 3

16

正确的方法是使用委托。您使用 prepareForSegue 中的属性向前传递数据并使用委托将数据传回。

它的工作方式是在 ViewC 中有一个委托属性,该属性由 ViewB 在 prepareForSegue 中设置。这样 ViewC 可以通过您设置的协议与 ViewB 通信。

编辑:添加代码来演示:

ViewControllerB接口:

@protocol ViewBProtocol

- (void)setData:(NSData *)data;

@end

@interface ViewBController: UIViewController <ViewBProtocol>
...
@end

在这里,我们让 ViewBController 遵循 ViewCController 将与之通信的协议。

接下来是 ViewCController 接口:

@interface ViewCController: UIViewController

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

...

@end

现在我们看一下 ViewBController 的 prepareForSegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController* controller = [segue destinationViewController];
    if ([controller isKindOfClass:[ViewCController class]])
    {
        ViewCController* viewCController = (ViewCController *)controller;
        viewCController.delegate = self;
    }
}

如您所见,我们通过委托属性将 ViewC 控制器链接到 ViewB 控制器。现在我们在 ViewC 中做一些事情:

- (void)sendData:(NSData *)data
{
    [self.delegate setData:data];
}

如果你愿意,你可以在 ViewCController 的 viewWillDisappear 方法中使用它。

于 2012-08-09T15:18:53.447 回答
2

我在最近的一个项目中解决这个问题的方法如下;

视图 AparentViewController,所以可以像这样随时从视图 B视图 C访问;

ViewAClass *parentView = (ViewAClass *)self.parentViewController;

然后,您可以读取和写入View A的属性,例如;

NSString *string = parentView.someStringProperty;

或者

parentView.someStringProperty = @"Hello World";

编辑 - “使用退出按钮从视图 B 返回到视图 A”

[parentView popViewControllerAnimated:YES];
于 2012-08-09T14:39:55.040 回答
-1

你在使用导航控制器吗?如果是,您可以使用 Singleton 轻松传递数据,这是我最喜欢的方式,而且它易于使用。否则,如果您尝试使用按钮或其他方式浏览视图,请尝试为您的 segue 设置标识符,然后调用方法“performSegueWithIdentifier”

于 2012-08-09T14:38:06.447 回答