我浏览了很多“视图控制器之间的传递数据”问题。但我似乎无法掌握传递数据的概念。
为什么从一个视图到另一个视图获取用户或系统生成的值是如此麻烦? 我是Objective-C的新手,但我之前做过一些编程,所以我并不熟悉所有的术语。
我已经阅读了有关委托,协议,单身人士和segue的内容。我试图尝试使用示例文件,但无法根据我的需要回收代码,也不了解传递数据所需的过程。
我想学习的是如何将所有生成的数据从1个UIViewController传递给多个UIViews。我生成的所有值都需要能够即时更新并且无需视图切换即可访问,也不需要按下按钮来更新/传递数据槽。
有人可以一劳永逸地向我解释如何在不同的头文件和UIViews之间传递数据。它让我疯狂,我只希望数据存在,随时随地都可访问。
这就是我想要创造的东西, 我有三个滑块,每个滑块代表一个轴。
用户可以根据滑块使用的值创建两个关键帧。
保存这些值(在UIViewControler.m中)并在屏幕上创建可视关键帧(UIImage)。 关键帧1和关键帧2,这些关键帧将用作UIBezierCurve的CGPoints。
话虽如此,我将UIView拖入我的UIViewController并将UIView链接到我的“BezierGraphView.h”。
现在我需要将这些关键帧点传递给BezierGraphView。我该怎么做?
答案 0 :(得分:2)
编辑以澄清: 这就是可以将数据从控件(滑块)发送到其他.h的方式,就像你所说的那样,UIView。在多个UIViewController之间发送数据时,您可以使用segues和委托方法。 BezierGraphView是一个View,而不是ViewController。正如有人在评论中建议的那样,我会对MVC(模型 - 视图 - 控制器)范例进行一些研究。
好像你有一个带有四个子视图的UIViewController。三个UISliders,以及一个具有一些自定义drawRect代码的BezierGraphView。如果要在更改时将滑块值发送到BezierGraphView,请执行以下操作:
首先,确保您的UIViewController中有BezierGraphView和滑块的插座。
其次,为滑块的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
答案 1 :(得分:0)
在iOS中,ViewControllers花费了大量时间。 视图控制器非常重要,主要有两个原因:
Theres有两种不同类型的数据传递。 Theres将数据对象从UIViewController传递到另一个UIViewController [在这里精美地解释:Passing Data Objects]。然后是UIViewController使用数据对象在屏幕上显示信息的方法。
因此,为了在屏幕上显示UIViewController效果,您需要:
例如,您可以在此处生成和使用临时数据来在屏幕上显示信息。假设有一个User对象和一个UserNameLabel;
- (id)init {
if (self = [super init]) {
self.user = [User newUserWithTempData];
}
return self;
}
然后在viewDidLoad方法中:
- (void)viewDidLoad
{
[super viewDidLoad];
self.userNameLabel.text = self.user.nameString;
}
这会处理使用数据影响屏幕上的视图。如果您询问如何在不同的View Controller之间共享User对象,那么这是一个不同的问题,如果您愿意,我可以解释。
编辑:我假设您的问题是询问如何从故事板中获取对视图的引用。
我将逐步解释此图像中的所有内容,因为它有望引导您完成所有步骤。我将根据编号箭头所指的内容将其分解。我们走了:
箭头1
箭头1指向UITableViewCell子类的xib的文档大纲。
注意: CircleView是UIView的自定义子类。通过以下实现:
#import "CircleView.h"
@implementation CircleView
- (void)drawRect:(CGRect)rect{
// CUSTOM DRAWING METHOD HERE
}
@end
箭头1指向屏幕上的自定义 CircleView 视图。为此,我在屏幕上添加了一个UIView,然后更改了类。
箭头2
Arrow 2指出如何将Storyboard或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有两种方法,我会快速展示,但如果你好奇,请告诉我,我会添加更多。
这是一张快照:
<强>完整强>
现在,当我运行应用程序时,该视图现在是一个圆形视图,一个在该区域绘制阴影圆圈的自定义类。
此时,您可以在viewDidLoad函数中更改所需内容。