Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否有充分的理由从自定义UIView创建指向UIViewController的指针_Ios_Objective C_Uiview_Uiviewcontroller - Fatal编程技术网

Ios 是否有充分的理由从自定义UIView创建指向UIViewController的指针

Ios 是否有充分的理由从自定义UIView创建指向UIViewController的指针,ios,objective-c,uiview,uiviewcontroller,Ios,Objective C,Uiview,Uiviewcontroller,我刚刚继承了一个代码库,项目似乎主要由UIView组成 以下是2014年7月29日编写的UIView头文件示例,因此代码相对较新: #import <UIKit/UIKit.h> @interface SettingsView : UIView { UIView *aView; UIViewController *controller; } @property(nonatomic,strong)UIView * aView; @property(nonatomic,

我刚刚继承了一个代码库,项目似乎主要由UIView组成

以下是2014年7月29日编写的UIView头文件示例,因此代码相对较新:

#import <UIKit/UIKit.h>

@interface SettingsView : UIView {
    UIView *aView;
    UIViewController *controller;
}
@property(nonatomic,strong)UIView * aView;
@property(nonatomic,strong)UIViewController * controller;

@end
对我来说,这个代码不正确。然而,我想知道是否有一个很好的理由让某人拥有一个从UIView到UIViewController的指针。这些年来,我看到了我的iOS代码,这是我第一次看到这一点


如果您有任何见解,我们将不胜感激。

UIView
中包含
UIViewController
引用是没有坏处的,除非它创建了一个强大的保留周期,如果
ViewController
指向具有强引用的
View
,而
View
也指向具有强引用的
ViewController
,则这并不特定于ViewController和View,但可能发生在任意两个对象上,在这种情况下,这两个对象都不会得到dealloc,这是内存泄漏。 除此之外,没有问题,在您的例子中,它保持对
viewController
的引用,因为它使用viewController的视图作为
subView
,这很好


但最佳实践是让您的业务逻辑远离
视图
并避免紧密耦合,在MVC环境中
视图
不应该有任何业务逻辑,控制器应该处理这一点,我想说,上面的代码不是很好的工作方式,没有正确地遵循MVC,并且是紧密耦合的。

我也这样使用我的视图。我使用一个名为“sender”的变量,UIView用它跟踪调用它的UIVC。然后,我可以执行各种逻辑操作,知道父视图的大小,将视图添加为子视图,而无需显式声明它

这是最好的方式吗?不,它打破了MVC,它没有明确地将UI与功能分开,但它也更方便,更易于编码

您可以决定在UIView中添加将影响其senderVC的按钮或操作

func openWebViewController(#URL: NSURL) {
    var webViewController = SVModalWebViewController(URL: URL)
    senderVC.presentViewController(webViewController, animated: true, completion: nil)
}
这是我使用UIVC指针的一个小例子,很抱歉,它很快,但应该可以理解


我同意这段代码有一股难闻的味道——它肯定不会遵守MVC。我怀疑视图中也有很多业务逻辑,在视图控制器中更好。是的,视图几乎包含所有内容。可以看到的UIViewController不多。视图甚至可以处理例如UITableViewDataSource和UITableViewDelegate方法。。谢谢你的回复。我编辑了这篇评论,因为我是在你编辑之前写的。是的,这很有道理。它似乎从根本上被打破了,有很多危害。任何视图都不应引用视图控制器。至少不是直接的。编写视图代码以了解视图控制器后,您的操作就不正确了。它会导致严重的耦合问题。视图应独立存在,并可由任何视图控制器或父视图使用。如果要执行任何操作,视图应该具有委托属性并定义自己的协议。想想
UITableView
及其
delegate
dataSource
属性和相关协议。请注意,
UITableView
对任何视图控制器都一无所知。我所说的,我所说的无害的意思是,它将进行编译,如果它不创建保留周期,那么它将是正常的,不会有内存泄漏,但它违背了MVC的基本概念,每个视图控制器都有自己的,但我更喜欢使用UIViewController包含。这样子VC会在需要时自动引用其parentViewController,并可以对外观/消失等做出反应。我只对愚蠢的可重用UI元素使用自定义UIView。我不使用故事板或xib,所以我所有的都是智能可重用UI元素
func openWebViewController(#URL: NSURL) {
    var webViewController = SVModalWebViewController(URL: URL)
    senderVC.presentViewController(webViewController, animated: true, completion: nil)
}