【问题标题】:Transferring Data Back to Original View将数据传输回原始视图
【发布时间】:2012-10-23 23:22:46
【问题描述】:

所以我可以像这样将数据从第一个视图传输到第二个视图:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   if ([segue.identifier isEqualToString:@"Check Mark Segue"])
      {
        NSLog(@"Transfering Data");
        AutoRenewDrop *controller = segue.destinationViewController;
        controller.transferData = self.renewDate.text;
      }
}

但是,当用户点击完成并且 transferData 工作正常但 renewDate.text 没有改变时,我尝试将新值传输回 renewDate.text。这是我用来传回数据的代码:

-(IBAction)done:(UIStoryboardSegue *)segue {

[self.navigationController popViewControllerAnimated:YES];
AddR *add = [[AddR alloc] init];
add.renewDate.text = transferData;

}

谁能告诉我如何解决这个问题?

【问题讨论】:

  • 您为什么希望它起作用? - [[SomeClass alloc] init] 每次调用时都会返回一个新实例,因此这将设置 AddR 类的另一个实例的属性...您应该区分类和对象。
  • 我明白了,感谢您的评论。那么我会只做 AddR *add; 吗?抱歉,我对 Xcode 并不陌生,但这是我第一次不得不在视图之间共享数据,所以我仍在学习中。
  • 不要那样做! 在这种情况下它要么未初始化(并崩溃),要么为零,然后它不会做任何事情。您需要向第二个视图添加一个属性,将其设置为第一个视图(因此本质上是通过第一个视图本身),然后从第二个视图,在self(指向第一个视图)上使用该属性设置文本。
  • 啊,当然。如果你不介意的话,愿意给我一个例子来说明这是如何工作的吗?我试图了解如何做到这一点。我把它改成了我相信你所说的方式,但它仍然不适合我。
  • 在第二个视图的类上,声明@property UIView *previousView;,然后在同一个类中,写[self.previousView setText:blah];。另外不要忘记在您创建第二个视图实例的第一个视图的类的方法中写入secondView.previousView = self;

标签: objective-c ios xcode data-transfer


【解决方案1】:

您需要将包含第一个视图的引用的属性添加到第二个视图中:

@interface AutoRenewDrop
@property(weak, nonatomic) AddR *callerView;
@end

然后在第二个视图的 done 方法中,您可以在调用者视图中更新变量:

-(IBAction)done:(UIStoryboardSegue *)segue {
[self.navigationController popViewControllerAnimated:YES];
callerView.renewDate.text = transferData;
}

当然,当您实例化第二个视图时,您必须设置引用,以这种方式:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   if ([segue.identifier isEqualToString:@"Check Mark Segue"])
      {
        NSLog(@"Transfering Data");
        AutoRenewDrop *controller = segue.destinationViewController;
        controller.transferData = self.renewDate.text;
        controller.callerView = self; //Here, you are passing the reference to this View
      }
}

【讨论】:

  • 非常感谢你的作品就像一个魅力。唯一的事情是我需要用你的答案编辑一件事! @aleroot
【解决方案2】:

您应该使用委托。 您可以阅读关于协议和委托的非常好的教程here

假设您有 2 个 ViewController - VC1 和 VC2,假设 VC1 显示 VC2。

在 VC2.h 中

@protocol VC2Delegate <NSObject>
- (void)updateData:(id)theData;
@end

@interface
@property (nonatomic, weak) id<VC2Delegate> delegate;
@end

在 VC2.m 中

@syntesize delegate;

- (void)done
{
    [delegate updateData:myData];
}

在 VC1.h 中

@interface VC1 : UIViewController<VC2Delegate>

在 VC1.m 中

- (void)goToVC2
{
    VC2 *vc2 = [[VC2 alloc] init];
    vc2.delegate = self;
    // present vc2
}

- (void)updateData:(id)data
{
    // update what you need
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-22
    • 2012-04-15
    • 2013-06-23
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多