【问题标题】:How to pass data back from one view to other View in IOS?如何将数据从一个视图传回IOS中的另一个视图?
【发布时间】:2012-08-06 19:29:00
【问题描述】:

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

让我们说 -> 将数据传递给其他视图

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

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

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

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

如何将数据从 ViewC 传回 ViewB?

我想你们可以帮助我。

编辑

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

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

感谢你们的帮助。

【问题讨论】:

    标签: iphone ios ios5 uiviewcontroller modalviewcontroller


    【解决方案1】:

    正确的方法是使用委托。您使用 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 方法中使用它。

    【讨论】:

    • 我现在尝试了代表,但它的 ViewC 没有调用 ViewB 我不确定发生了什么..你有什么好的教程来与协议通信
    • 感谢您在我尝试为委托设置属性时的详细回答,我最终出错@synthesize of 'weak' property is only allowed in ARC or GC mode google 了它,但找不到确切的解决方案..
    • 不使用 ARC? :) 是的,strong 和 weak 只是 ARC,使用 retain 代替。
    • @Abizern 使用委托传回数据比使用父视图作为模型更正确的是什么?同样,在具有超过 2 或 3 个视图的视图层次结构中,代码开始变得更加难以辨认,因为您最终会得到很多不重要的委托。
    • 它打破了 MVC 范式,而且使用协议在某种程度上解耦了视图控制器。如果 ViewC 不是来自 ViewB 而是来自 ViewB2 怎么办?
    【解决方案2】:

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

    View AparentViewController,所以可以像这样随时从View BView C访问; p>

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

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

    NSString *string = parentView.someStringProperty;
    

    parentView.someStringProperty = @"Hello World";
    

    编辑 - “从视图 B 返回到视图 A,但没有返回按钮”

    [parentView popViewControllerAnimated:YES];
    

    【讨论】:

    • 感谢您的回答好友.. 如果没有返回按钮,您将如何从视图 B 回到视图 A
    • Witin ViewB 电话:[self.navigationController popViewControllerAnimated:YES];
    • @jonathanlking 编辑了我的问题,请检查它..我想在哪里声明ViewAClass *parentView = (ViewAClass *)self.parentViewController; 我真的很困惑对不起这可能很简单
    • 好的,正在发生的事情称为强制转换。您知道 viewA 是什么类,但编译器不知道,因此通过将 (ViewAClass *) 放在 self.parentViewController 之前,您可以让编译器知道它是什么类。在您的代码中而不是“ViewAClass”中写下 viewA 的控制器类的名称。
    • 正如 Chutu 所说.. 我的问题已解决,感谢您的支持.. +1 为您服务
    【解决方案3】:

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

    【讨论】:

    • 在我的项目中,我想在摇动完成后发回数据。我尝试了 performegueWithidentifier 但最终遇到了问题中提出的问题
    • 如果你使用单例传递数据,你只是将视图控制器耦合到单例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2012-08-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多