解释想要:UIViewController和UIView之间传递数据的概念
我浏览了很多“视图控制器之间传递数据”的问题。 但是我似乎无法理解传递数据的概念。
为什么将用户或系统生成的值从一个视图转移到另一个视图是一件麻烦的事情? 我是Objective-C的新手,但是我之前做过一些编程,所以我并不熟悉所有的术语。
我已经阅读了关于委托,协议,单例和segue的。 我试图尝试使用示例文件,但无法回收代码以满足我的需求,也不了解传递数据所需的stream程。
我想学习的是如何将所有生成的数据从1个UIViewController传递给多个UIViews。 我生成的所有值都需要能够即时更新,无需视图切换即可访问,也不需要按下button来更新/传递数据槽。
有人可以请解释一次,如何在不同的头文件和UIViews之间传递数据。 这使我疯狂,我只想让数据在那里,随时随地都可以访问。
这就是我想创造的,我有三个滑块,每个代表一个轴。
用户可以基于滑块使用的值创build两个关键帧。
这些值被保存(在UIViewControler.m中),并在屏幕上创build一个可视化关键帧(UIImage)。 关键帧1和关键帧2,这些关键帧将用作UIBezierCurve的CGPoint。
这就是说,我把一个UIView拖入我的UIViewController,并将UIView链接到我的“BezierGraphView.h”。
现在我需要将这些关键帧点传递给BezierGraphView。 我将如何做到这一点?
在iOS中,ViewControllers花费了大量的时间。 视图控制器是非常重要的两个主要原因:
- 他们有引用在屏幕上查看对象(即self.loginButton指的是一个UIButton视图控制器可以访问)
- 他们知道数据模型。 (即有与屏幕相关的数据的引用)
这两种不同types的数据传递。 Theres从UIViewController传递数据对象到一个不同的UIViewController [在这里精美地解释: 传递数据对象 ]。 然后是UIViewController使用数据对象在屏幕上显示信息的方法。
所以为了在屏幕上有一个UIViewController效果,你需要:
- 有一个数据对象(一个数组,一个自定义对象,任何东西)
- 有一个视图的参考(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; }
这处理使用数据来影响屏幕上的视图。 如果你问如何在不同的视图控制器之间共享用户对象,那么这是一个不同的问题,我可以解释一下,如果你愿意的话。
编辑:我假设你的问题是要求如何从故事板获得一个视图的参考。
我会一步步地在这个图像中解释所有的东西,因为它可以引导你完成所有的步骤。 我会根据编号的箭头指向什么来分解它。 开始了:
箭头1
箭头1指向UITableViewCell子类的xib的Document Outline。
注意: CircleView是UIView的自定义子类。 通过以下实施:
#import "CircleView.h" @implementation CircleView - (void)drawRect:(CGRect)rect{ // CUSTOM DRAWING METHOD HERE } @end
箭头1指向屏幕上的自定义CircleView视图。 为此,我添加一个UIView到屏幕上,然后更改类。
箭头2
箭头2指向如何将故事板或界面生成器中的视图更改为具有自定义实现的自定义视图。 在这里,只需select视图并打开文件检查器就可以了。 然后find这个选项卡,并将自定义类从UIView更改为MyCustomView。
箭头3
箭头3指向与Interface Builder中的自定义视图相关的属性 。
这是它的代码:
#import <UIKit/UIKit.h> @class CircleView; @interface CreateNewQuestionCell : UITableViewCell @property (nonatomic, weak) IBOutlet CircleView *circleView; @end
这是您使用您创build的自定义类声明该属性的位置。 确保有IBOutlet,以便Xcode可以允许下一步工作:)
箭头4
箭头4指向一个指示器,告诉你属性是否在故事板的视图中连接到类中的属性。 这是你如何确保一切都连接起来。
Theres 2种方式来做到这一点,我会展示快速的方式,但如果你好奇,让我知道,我会增加更多。
- 点击指标并拖动到您创build和发布的自定义视图。 [顺便说一句,要打开2个屏幕,打开助手编辑器]
这是一个快照:
完成
现在,当我运行应用程序,该视图现在是一个圆形视图,一个自定义的类,在该地区绘制一个阴影圆圈。
此时,您可以在viewDidLoad函数中更改所需的任何内容。
编辑澄清:这是如何可以从您的控件(滑块)发送到其他.h的数据,如你所说,UIView。 当在多个UIViewController之间发送数据时,你可以通过代理方法来实现。 BezierGraphView是一个View,而不是ViewController。 正如有人在评论中提出的那样,我会对MVC(模型 – 视图 – 控制器)范例进行一些研究。
看起来你有一个单独的UIViewController有四个子视图。 三个UISliders和一个BezierGraphView,它有一些自定义的drawRect代码。 如果您想在更改时将滑块值发送到BezierGraphView,请执行如下操作:
首先,确保你的BezierGraphView和你的UIViewController中有滑块。
其次,为滑块的Value Changed控件创build一个动作,并将所有三个控件挂钩。
// 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,并且可以通过valuesDidChangeWithX:Y:Z:方法告诉BezierGraphView更新:
//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