需要解释:在 UIViewController 和 UIView 之间传递数据的概念 [关闭]

Posted

技术标签:

【中文标题】需要解释:在 UIViewController 和 UIView 之间传递数据的概念 [关闭]【英文标题】:Explanation wanted: Concept of passing data between UIViewController and UIView [closed] 【发布时间】:2014-02-08 21:27:34 【问题描述】:

我浏览了很多“在视图控制器之间传递数据”的问题。但我似乎无法理解传递数据的概念。

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

我已经阅读了有关委托、协议、单例和 segue 的信息。我尝试使用示例文件进行试验,但无法根据需要回收代码,也不了解传递数据需要哪些过程。

我想要学习的是如何将所有生成的数据从 1 个 UIViewController 传递到多个 UIView。我生成的所有值都需要能够即时更新并且可以访问,而不需要视图开关,也不需要按下按钮来更新/传递数据槽。

有人可以一劳永逸地解释一下如何在不同的头文件和 UIView 之间传递数据。这让我发疯了,我只想让数据在我需要的任何时间和地点都可以访问。

这就是我想要创造的, 我得到了三个滑块,每个滑块代表一个轴。

用户可以根据滑块使用的值创建两个关键帧。

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

话虽如此,我将一个 UIView 拖入我的 UIViewController 并将 UIView 链接到我的“BezierGraphView.h”。

现在我需要将这些关键帧点传递给 BezierGraphView。我该怎么做?

【问题讨论】:

你是如何从一个视图控制器到另一个视图控制器的?你在使用故事板和转场吗? “我要学习的是如何将所有生成的数据从 1 个 UIViewController 传递到多个 UIViews”是“UIViews”一个错字,你想要“多个 UIViewController”或者它的意图是方式? @nhgrif 我正在使用情节提要,只有 1 个 UIViewController 所有 UIView 都在 UIViewController 的窗口/屏幕中。不,我没有使用 segues 我还在 UIViewController 上获得了 huttons/sliders/textFields 和标签。我基本上不会从一个视图移动到另一个视图,一切都在 1 个视图控制器上 @LordZsolt 我得到了 1 个 UIviewController,其中有 1 个 UIView 链接到一个单独的标题以在 drawRect 方法上显示 UIBezierCurves 我认为您需要提供一些代码,以便我们为您提供一个示例,说明如何准确地执行您正在尝试执行的操作... 【参考方案1】:

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

您似乎有一个带有四个子视图的 UIViewController。三个 UISlider 和一个 BezierGraphView,其中包含一些自定义 drawRect 代码。如果您想在 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

【讨论】:

谢谢,我会尽快尝试!【参考方案2】:

ios 中,很多时间都花在了 ViewControllers 上。 视图控制器非常重要,主要有两个原因:

它们引用了屏幕上的视图对象(即 self.loginButton 是指视图控制器可以访问的 UIButton) 他们知道数据模型。 (即有对与屏幕相关的数据的引用)

有两种不同类型的数据传递。将数据对象从 UIViewController 传递到不同的 UIViewController [这里解释得很漂亮:Passing Data Objects]。然后是 UIViewController 使用数据对象在屏幕上显示信息的方法。

所以为了在屏幕上产生 UIViewController 效果,您需要:

    拥有一个数据对象(一个数组、一个自定义对象,任何东西) 具有对视图的引用(UILabel、UIButton 等)

例如,这里是您如何生成和使用临时数据在屏幕上显示信息的方法。假设有一个 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; 

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

编辑:我假设您的问题是询问如何从情节提要中获取对视图的引用。

我将逐步解释这张图片中的所有内容,因为它有望引导您完成将所有内容组合在一起的步骤。我将根据编号箭头所指的内容对其进行分解。我们开始:

箭头 1

箭头 1 指向 UITableViewCell 子类的 xib 的文档大纲。

注意: CircleView 是 UIView 的自定义子类。使用以下实现:

#import "CircleView.h"

@implementation CircleView

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


@end

箭头 1 指向屏幕上的自定义 CircleView 视图。为此,我在屏幕上添加了一个 UIView,然后更改了类。

箭头 2

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

箭头 3

箭头 3 指向与 Interface Builder 中的自定义视图相关的属性

这是它的代码:

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

这里是您使用您创建的自定义类声明属性的地方。确保有 IBOutlet 以便 Xcode 可以允许下一步工作:)

箭头 4

箭头 4 指向一个指示器,该指示器告诉您故事板视图中的属性是否连接到类中的属性。这就是您确保一切都连接起来的方式。

有两种方法可以做到这一点,我将展示快速方法,但如果你好奇,请告诉我,我会添加更多。

单击指示器并拖动到您创建并释放的自定义视图。 [顺便说一句,要打开 2 个屏幕,请打开助手编辑器]

这是一个快照:

完成

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

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

【讨论】:

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

以上是关于需要解释:在 UIViewController 和 UIView 之间传递数据的概念 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController 中动态大小的表格视图

CoreData + UIViewController + UITableView

在 UIViewController (iOS) 中重新启动绘图和事件

如何使用 MainStoryBoard 加载和更改 UIViewController [IOS]

iOS - UIVIewController 中的 UITableView 不显示所有行 [Swift]

带有 UIViewController 的插件