MonoTouch 以编程方式为 ContainerView 实例化 ViewController

Posted

技术标签:

【中文标题】MonoTouch 以编程方式为 ContainerView 实例化 ViewController【英文标题】:MonoTouch Instantiating a ViewController programmatically for ContainerView 【发布时间】:2013-02-01 15:13:21 【问题描述】:

我正在尝试在 MonoTouch 中使用容器视图,并且我正在在线学习一些教程。他们谈论以编程方式从容器中添加和删除视图控制器。我在项目的故事板中创建了一个视图控制器和视图,并附加了一些出口和一个动作(分别用于标签和按钮)。我创建了一个重载的构造

这是我试图将 viewControllers 添加到容器视图中的视图控制器中的代码。

public override void ViewDidLoad ()
    
        base.ViewDidLoad ();
        ContainerView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight;
        _controllerOne = new IngredientsController("Perishables");
        _controllerTwo = new IngredientsController("Spices");
        AddChildViewController(_controllerOne);
        ContainerView.AddSubview(_controllerOne.View);
        _controllerOne.DidMoveToParentViewController(this)
    

当我为 _controllerOne 添加子视图时,我收到一个错误,因为我的控制器上的元素被标记为空。如果控制器是在 Interface Builder 中制作的,MonoTouch 是否无法以编程方式创建视图控制器?下面是成分控制器的两个构造函数。使用 segue 时,所有 UI 控件都会正确初始化。我是否需要以编程方式创建控制器,然后以这种方式实例化它?任何帮助将不胜感激。

//This ctor does not work
public IngredientsController (string title) : base(NSObjectFlag.Empty)

_ingredientTitle = title;


//This ctor works
public IngredientsController (IntPtr handle) : base (handle)


【问题讨论】:

【参考方案1】:

尝试交换AddSubView()DidMoveToParentViewController() 方法,如下所示:

public override void ViewDidLoad ()

    base.ViewDidLoad ();
    ContainerView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight;
    _controllerOne = new IngredientsController("Perishables");
    _controllerTwo = new IngredientsController("Spices");
    this.AddChildViewController(_controllerOne);        // Root child controller.
    _controllerOne.DidMoveToParentViewController(this); // Confirm the rooting.
    ContainerView.AddSubview(_controllerOne.View);      // Access the view.

【讨论】:

【参考方案2】:

尝试像这样实例化视图控制器:

public override void ViewDidLoad ()
    
        base.ViewDidLoad ();

        this.ContainerView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight;

        var newController = this.Storyboard.InstantiateViewController("IngredientsController");

        this.AddChildViewController (newController);        
        this.ContainerView.AddSubview (mapController.View);
    

确保在 ViewController 的属性面板中设置 Storyboard Id

【讨论】:

以上是关于MonoTouch 以编程方式为 ContainerView 实例化 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Monotouch 在 iPad 故事板应用程序中以编程方式管理视图

以编程方式将约束添加到相对于同级的视图

以正确方向以编程方式显示 UIView 的最佳实践

MonoTouch 中的弱事件模式

Monotouch - 缓存地图以供离线使用

MonoTouch 5.0:获取 MonoDevelop 以使用 iOS 5 SDK/模拟器