Monotouch:覆盖 UIViewController 方法的正确方法

Posted

技术标签:

【中文标题】Monotouch:覆盖 UIViewController 方法的正确方法【英文标题】:Monotouch: The correct way to override UIViewController method 【发布时间】:2011-09-10 15:02:38 【问题描述】:

假设我有一个名为 MyCustomUIViewController 的自定义控制器,它扩展了 UIViewController:

public class MyCustomUIViewController : UIViewController

   //- my class implementation

现在我想重写这样的方法:

public override void ViewDidLoad()

   base.ViewDidLoad();

   //- other stuff here

是否需要调用 base.ViewDidLoad() ?我必须在哪里调用基本方法?在自定义代码之前或之后(即此处的其他内容)?我见过很多示例,其中基本方法是在做某事之后放置的,甚至被省略了。

提前谢谢你。问候。

【问题讨论】:

【参考方案1】:

是的,当您覆盖时,您需要调用 base。调用 base 可确保您不会短路苹果现在或将来可能拥有的东西。此外,这是一个好习惯,因为在更深层次的继承中,您还可以将一些需要调用的代码短路。

通常,您首先调用 base。

例如,如果这个典型的objective-c代码是等价的:

- (void)viewDidLoad

    [super viewDidLoad];

    [[self navigationItem] setTitle:@"Title"];

    // ...

【讨论】:

【参考方案2】:

ViewDidLoad 的默认实现是空的,因此如果您选择调用 base.ViewDidLoad() 并开始调用,更不用说调用位置了。

插入对基本实现的引用的一个原因是确保您的代码仍然可以正常工作,如果 Apple 重新设计 viewDidLoad 以使其确实执行某些操作。在这种情况下,我认为您最好将调用放在 ViewDidLoad 实现的开头,但这种情况不太可能发生。

【讨论】:

出于这个原因调用 base 是一种很好的做法 - 由于面向对象的封装,您不应继续假设 base 什么都不做。除此之外,在某些情况下,您有更深的继承,并且始终调用 base 可确保您不会使某些代码短路。 @bryanmac 很好!我缺少的是 ViewDidLoad 的默认实现是空的。因此,如果MyCustomUIViewController 直接扩展UIViewController,则可以省略基本调用。

以上是关于Monotouch:覆盖 UIViewController 方法的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

MonoTouch UIButton、UIPickerView 和覆盖只读 InputView

iOS 上 MonoTouch 中的多点触控

在 Monotouch 中的 UIPageViewController 中检测控件上的触摸事件

Monotouch对话框多行元素高度没有增长

C# Monotouch/Xamarin - UITableViewCell GetCell ImageView 框架未调整大小

我无法在 Monotouch UITableViewController 中禁用页眉或页脚