2014-02-08 37 views
1

我浏览了很多“视图控制器之间传递数据”的问题。但我似乎无法理解传递数据的概念。说明想要:UIViewController和UIView之间传递数据的概念

为什么将用户或系统生成的值从一个视图转移到另一个视图是如此麻烦? 我是Objective-C的新手,但我在我的生活中做过一些编程,所以我并不熟悉所有的术语。

我已阅读关于委托,协议,单身和segue的。我试图尝试使用示例文件,但无法回收代码以满足我的需求,也不了解传递数据所需的流程。

我想要学习的是如何将所有生成的数据从1个UIViewController传递给多个UIViews。我生成的所有值都需要能够即时更新,并且无需视图切换即可访问,也不需要按下按钮即可更新/传递数据低谷。

有人可以请解释一次,如何在不同的头文件和UIViews之间传递数据。这让我疯狂,我只想让数据在那里,随时随地都可以访问。

这就是我想创建的, 我有三个滑块,每个代表一个轴。

用户可以根据它们与滑块一起使用的值创建两个关键帧。

这些值被保存(在UIViewControler.m中)并在屏幕上创建一个可视化关键帧(UIImage)。 关键帧1和关键帧2,这些关键帧将用作UIBezierCurve的CGPoint。

这就是说,我把一个UIView拖入我的UIViewController并将UIView链接到我的“BezierGraphView.h”。

现在我需要将这些关键帧点传递给BezierGraphView。我将如何做到这一点?

+0

你是如何从一个视图控制器到下一个?你正在使用故事板和赛格? – nhgrif

+0

“我试图学习的是如何将所有生成的数据从1个UIViewController传递到多个UIViews”是“UIViews”的一个错字,并且您想要“多个UIViewController”,或者它的目的是这样吗? –

+0

@ nhgrif我正在使用故事板,只有1 UIViewController所有UIViews在UIViewController的窗口/屏幕。不,我没有使用segues,我也在UIViewController上获得了huttons/sliderrs/textFields和标签。我不是从视图移动到基本查看,一切都在1视图控制器 – Seeerdar

回答

0

在iOS中,ViewControllers花了很多时间。 视图控制器的原因主要有两点非常重要:

  • 他们引用查看屏幕上的对象(即self.loginButton指的是一个UIButton的视图控制器访问)
  • 他们知道的数据模型。 (即涉及与屏幕相关的数据)

Theres两种不同类型的数据传递。 Theres将数据对象从UIViewController传递给一个不同的UIViewController [在这里精美地解释:Passing Data Objects]。然后是UIViewController使用数据对象在屏幕上显示信息的方法。

所以为了在屏幕上有一个UIViewController效果的东西,你需要:

  1. 有一个数据对象(数组,自定义对象,任何事情真的)
  2. 有一个视图的引用(UILabel,UIButton等)

例如,下面是如何生成和使用临时数据在屏幕上显示信息。假设有一个用户对象和一个UserNameLabel;

- (id)init { 
    if (self = [super init]) { 
     self.user = [User newUserWithTempData]; 
    } 
    return self; 
} 

然后在viewDidLoad方法:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.userNameLabel.text = self.user.nameString; 
} 

此处理使用数据以影响在屏幕上的意见。如果你问如何在不同的视图控制器之间共享用户对象,那么这是一个不同的问题,如果你愿意,我可以解释。

编辑:我假设你的问题是问如何从故事板获得一个视图的参考。

我将解释一步这一形象一步一切,因为它有望引导您的步骤把它放在一起。我会根据编号的箭头指向什么来分解它。在这里,我们去:

Numbered breakdown of wiring up properties

箭1

箭头1指向一个UITableViewCell子类的厦门国际银行的文档大纲。

注: CircleView是的UIView的定制子类。随着下面的实现:

#import "CircleView.h" 

@implementation CircleView 

- (void)drawRect:(CGRect)rect{ 
    // CUSTOM DRAWING METHOD HERE 
} 

@end 

箭头1指向自定义CircleView在屏幕上查看。为此,我将UIView添加到屏幕上,然后更改类。

箭2

箭头2指向如何在故事板或Interface Builder的视图改变为具有自定义实现自定义视图。在这里,只需选择视图并打开文件检查器就可以了。然后找到此选项卡并将自定义类从UIView更改为MyCustomView。

箭头3

箭头3所指向的属性,涉及到在界面生成器的自定义视图。

下面是它的代码:

#import <UIKit/UIKit.h> 
@class CircleView; 
@interface CreateNewQuestionCell : UITableViewCell 
    @property (nonatomic, weak) IBOutlet CircleView *circleView; 
@end 

在这里你申报财产,使用您创建的自定义类。确保有IBOutlet中,这样的Xcode可以让下一步工作:)

箭头4

箭4指向,告诉你一个指标的属性是否是在视图上从故事板是连接到课堂中的财产。这是你如何确保一切都连接起来。

Theres 2种方式来做到这一点,我会展示快速的方式,但如果你好奇,让我知道,我会添加更多。

  • 单击指示器并拖动到您创建并释放的自定义视图。 [BTW,获得2个屏幕打开,打开的助理编辑]

这里是一个快照:

Mapping property to custom view

完成

现在,当我运行的应用程序,该视图现在是一个圆形视图,一个在该区域绘制阴影圆的自定义类。

此时,您可以在viewDidLoad函数中更改任何需要的东西。

+0

谢谢你的解释,我目前无法尝试所有的答案我得到的代码。为了进一步解释我的情况。我有我的故事板,1 UIViewController,在这个单UIViewController我放置了多个UIView对象。其中一个UIViews链接到名为BezierCurveGraph的头文件,该视图使用UIViewController中定义的点创建UIBezierCurves。我需要将数据从UIViewController传递到UIView(BezierGraphView) – Seeerdar

+0

已更新,其中包含与您的问题相关的更改。 –

2

编辑澄清: 你这是怎么可以从你的控件(滑块)将数据发送给其他的.h的,正如你所说的那样,UIView的。在多个UIViewController之间发送数据时,您可以在segues上并通过委托方法执行此操作。 BezierGraphView是一个View,而不是ViewController。正如有人在评论中提出的那样,我会对MVC(模型 - 视图 - 控制器)范例进行一些研究。

看起来好像你有一个UIViewController有四个子视图。三个UISliders和一个具有一些自定义drawRect代码的BezierGraphView。如果您想在滑动条值发生变化时将滑块值发送到BezierGraphView,请执行如下操作:

首先,确保您的BezierGraphView和滑块位于UIViewController中。

其次,为滑块的Value Changed控件创建一个动作,并将所有三个控件挂钩。

// MyUIViewController.h 

#import <UIKit/UIKit.h> 
#import "BezierGraphView.h" 

@interface MyUIViewController : UIViewController 

@property (nonatomic, strong) IBOutlet BezierGraphView *graphView; 
@property (strong) IBOutlet UISlider *xSlider; 
@property (strong) IBOutlet UISlider *ySlider; 
@property (strong) IBOutlet UISlider *zSlider; 

-(IBAction)sliderValueDidChange; 

@end 

然后移动BezierGraphView的drawRect代码的函数:

//BezierGraphView.h 

#import <UIKit/UIKit.h> 

@interface BezierGraphView : UIView 

-(void)valuesDidChangeWithX:(CGFloat)xValue Y:(CGFloat)yValue Z:(CGFloat)zValue; 

@end 


//BezierGraphView.m 
#import "BezierGraphView.h" 

@implementation BezierGraphView 


-(void)valuesDidChangeWithX:(CGFloat)xValue Y:(CGFloat)yValue Z:(CGFloat)zValue{ 
    //drawRect code goes here 
} 


@end 

那么无论什么时候滑块的值的变化,它会告诉在sliderValueDidChange的UIViewController中,你可以告诉BezierGraphView与valuesDidChangeWithX更新:Y:Z:方法:

//MyUIViewController.m 

@implementation MyUIViewController 

//Other UIViewController stuff, like viewDidLoad 

-(IBAction)sliderValueDidChange{ 

    [self.graphView valuesDidChangeWithX:self.xSlider.value 
             Y:self.ySlider.value 
             Z:self.zSlider.value] 
} 

@end 
+0

谢谢,我会尽快尝试这一点! – Seeerdar