在iOS中的ViewControllers之间传递数据

时间:2014-05-22 09:32:02

标签: ios objective-c

我正在尝试在UIViewControllers之间传递一个整数值,新增到iOS并遇到问题。

在设置值的UIViewController中,没有问题。但是在设置值后NSLog显示第二个UIViewController中的值为空。

我的应用将使用水平滑块来确定UIImage animationDuration中不同UIViewController之间的时间长度。

此方法正确地从水平滑块接收值。我初始化了"其他"的一个实例。 UIViewControllerimageview.somedata属于另一个视图控制器。我知道由于下面的NSLogs,正确传递了值。

- (IBAction) changeButtonPressed:(id)sender {
imageView = [[GTImageView alloc] initWithNibName:@"GTImageView" bundle:nil];
NSLog(@"text value = %@", myTextField);
NSString *textValue = [myTextField text];
int value = [textValue floatValue];
if (value < 0) value = 0;
if (value > 100) value = 100;
mySlider.value = value;
sliderValue = &value;
NSLog(@"sliderValue = %d", *(sliderValue));
myTextField.text = [NSString stringWithFormat:@"%.1d", value];
if ([myTextField canResignFirstResponder]) [myTextField resignFirstResponder];
imageView.someData = *(sliderValue);
NSLog(@"imageView.someData = %d", imageView.someData);
}

这是该实施文件的顶部

    #import "GTSettingsVC.h"
    #import "GTImageView.h"
    #import "GTImageView.m"
    @interface GTSettingsVC ()
    @end

    @implementation GTSettingsVC
    @synthesize mySlider, myTextField;
    @synthesize sliderValue;

该头文件

    #import "GTImageView.h"
    @interface GTSettingsVC : UIViewController
    {
    IBOutlet UISlider *mySlider;
    IBOutlet UITextField *myTextField;
    GTImageView *imageView;
    int *sliderValue;
    }

    @property (nonatomic) int *sliderValue;

我正在尝试将数据发送到

的视图控制器的头文件
    #import <UIKit/UIKit.h>

    @interface GTImageView : UIViewController
    {
    UIScrollView* scrollView;
     UIPageControl* pageControl;
     int *someData;
     }
     @property (nonatomic) int *someData;

我希望变量some​​Data具有我在第一个控制器中给出的值的实现文件。 NSLog在此实现中返回null。

    - (void)viewDidLoad
    {
     [super viewDidLoad];
     // Do any additional setup after loading the view from its nib.



      UIImageView *animatedImageView = 
     [[UIImageView alloc] i nitWithFrame:CGRectMake(0,      55, 400, 550)];
      [self.view addSubview:animatedImageView];

       animatedImageView.animationImages = [NSArray arrayWithObjects:
                                     [UIImage imageNamed:@"IMG_0052.JPG"],
                                     [UIImage imageNamed:@"IMG_0054.JPG"],
                                     [UIImage imageNamed:@"IMG_0081.JPG"],
                                     nil];
      NSLog(@"some data = %@", someData);
   //   NSLog is returning null
      int x = someData;
      animatedImageView.animationDuration = 
      x * [animatedImageView.animationImages count];
      [animatedImageView startAnimating];
      [self.view addSubview: animatedImageView];

      }

2 个答案:

答案 0 :(得分:1)

没有必要采取int *。将其替换为int并直接赋值而不是地址。

答案 1 :(得分:1)

我相信您还没有掌握查看控制器生命周期以及模型视图控制器(MVC)的概念/理念。

您在第一个视图控制器( GTSettingsVC )的 changeButtonPressed 中定义和启动的 GTImageView GTSettingsVC 即可。如果视图控制器从 GTSettingsVC 转换为 GTImageView ,则数据将不会传递到那里。

由于您使用的是UINavigationController,我相信您拥有Segue。传递UINavigationController数据的最简单方法是使用prepareForSegue。在转换到此方法之前,您必须准备要传递给第二个视图控制器的数据。

你也在 GTImageView 中犯了一些错误。 someData 不是对象,不应该 * 。并尝试不使用变量,仅使用属性。它应该是: -

 @property (nonatomic) int someData;

GTSettingsVC.M 中,添加以下功能: -

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
  GTImageView * viewController = segue.destinationViewController;
  viewController.someData = 99;
}

GTImageView.H

@interface GTImageView : UIViewController
{
    UIScrollView* scrollView;
    UIPageControl* pageControl;
}
@property (nonatomic) int someData;
@end

GTImageView.M

中的 viewDidLoad
- (void)viewDidLoad
{
  [super viewDidLoad];
  UIImageView *animatedImageView =
  [[UIImageView alloc] initWithFrame:CGRectMake(0,55, 400, 550)];
  [self.view addSubview:animatedImageView];

  animatedImageView.animationImages = [NSArray arrayWithObjects:
                                     [UIImage imageNamed:@"IMG_0052.JPG"],
                                     [UIImage imageNamed:@"IMG_0054.JPG"],
                                     [UIImage imageNamed:@"IMG_0081.JPG"],
                                     nil];
  NSLog(@"some data = %d", self.someData);
  int x = self.someData;
  animatedImageView.animationDuration =
  x * [animatedImageView.animationImages count];
  [animatedImageView startAnimating];
  [self.view addSubview: animatedImageView];
}

我向Github添加了一个示例项目供您参考: - https://github.com/voyage11/PassingDataTest