是否有充分的理由从自定义UIView获得指向UIViewController的指针

时间:2015-08-22 11:57:48

标签: ios objective-c uiview uiviewcontroller

我刚刚继承了代码库,该项目似乎主要由UIViews组成。

以下是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

你可以看到有一个指向UIViewController的指针。在实现文件中,mainView在几个地方使用。这是一个例子:

MyView *myView = [[MyView alloc] initWithFrame:CGRectMake(0, yPos, scroller.frame.size.width, 50)];
myView = 102;
myView = mainView; // Here we are setting another view with this controller.
[scroller myView];

对我来说,这段代码感觉不对。但是我想知道是否有一个很好的理由,有人会有一个从UIView到UIViewController的指针。多年来我看到了我公平分享的iOS代码,这是我第一次见到这一点。

非常感谢任何见解。

2 个答案:

答案 0 :(得分:2)

我也像这样使用我的观点。我使用了一个名为&#34; sender&#34;的变量。 UIView跟踪调用它的UIVC。然后我可以做各种逻辑操作,知道父级的大小,将视图添加为子视图而不明确说明它。

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

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

func openWebViewController(#URL: NSURL) {
    var webViewController = SVModalWebViewController(URL: URL)
    senderVC.presentViewController(webViewController, animated: true, completion: nil)
}

这是我使用指向UIVC指针的风格的一个小例子,对不起它很快但它应该是可以理解的。

https://github.com/goktugyil/CozyLoadingActivity

答案 1 :(得分:0)

UIViewController内有UIView引用是没有害处的,除非它创建一个强大的保留周期,ViewController指向具有强引用的View和{view 1}}也指向具有强引用的ViewController,这不是viewController和view特有的,但它可能发生在任何两个对象上,在这种情况下,它们都不会得到dealloc和它的内存泄漏。  除此之外没有问题,在你的情况下它保持对viewController的引用,因为它使用viewController的视图为subView,这很好。

但最佳做法是保持业务逻辑远离view并避免紧密耦合,在MVC环境中view不应该有任何业务逻辑,控制器应该处理它,我会说上面的代码是不是很好的工作方式,并没有正确地跟随MVC并且紧密耦合。