Открытые свойства всегда равны нулю в ViewDidLoad в пользовательском TabBarController в MonoTouch - PullRequest
2 голосов
/ 22 августа 2011

Я работал над классом, производным от UITabBarController. На самом базовом уровне я пытаюсь добавить свойство BackgroundColor и другие открытые свойства, которые я могу создать в своем AppDelegate, когда создаю свой TabBarController.

Проблема, с которой я столкнулся, заключается в том, что все публичные свойства могут иметь значение null при вызове ViewDidLoad, или я могу добавить конструктор и атрибут [Register] и в конечном итоге иметь свойства, не равные null, но свойство ViewControllers (которое содержит все вкладки) становится необъяснимым образом нулевым (даже если вы установите его в ViewDidLoad).

Очевидно, мне нужно, чтобы обе вещи были правдой, и я упускаю что-то конкретное.

Вот версия кода, которая всегда приводит к нулевому BackgroundColor, даже если я явно установил его в AppDelegate:

public class TabBarController : UITabBarController
{
    public UIColor BackgroundColor { get; set; }

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

        if(BackgroundColor != null) // Always null, even when set explicitly
        {
            var frame = new RectangleF(0.0f, 0.0f, this.View.Bounds.Size.Width, 46);
            UIView myTabView = new UIView(frame);
            myTabView.BackgroundColor = BackgroundColor;
            myTabView.Alpha = 0.5f;
            this.TabBar.InsertSubview(myTabView, 0);
        }

        // Add tabs here, which show up correctly (on default background color)
        ViewControllers = new UIViewController[] { one, two, three, etc };
    }
}

Вот отредактированный код, который показывает правильный цвет фона (свойство не является нулевым), но отказывается разрешить свойству ViewControllers быть любым, кроме нуля, даже если оно только установлено в ViewDidLoad:

[Register("TabBarController")]
public class TabBarController : UITabBarController
{
    public UIColor BackgroundColor { get; set; }

    // Added a binding constructor
    [Export("init")]
    public TabBarController() : base(NSObjectFlag.Empty)
    {

    }

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

        if(BackgroundColor != null) // Hey, this works now!
        {
            var frame = new RectangleF(0.0f, 0.0f, this.View.Bounds.Size.Width, 46);
            UIView myTabView = new UIView(frame);
            myTabView.BackgroundColor = BackgroundColor;
            myTabView.Alpha = 0.5f;
            this.TabBar.InsertSubview(myTabView, 0);
        }

        // Tabs disappear, ViewControllers is always null
        ViewControllers = new UIViewController[] { one, two, three, etc };
        if(ViewControllers == null)
        {
            Console.WriteLine("Not bro");
        }
    }
}

Это, очевидно, лишает меня возможности писать некоторые пользовательские элементы управления, если мне приходится явно добавлять все элементы, не имея доступа к общим свойствам во время выполнения. Кто-нибудь знает, где я иду не так?

1 Ответ

1 голос
/ 23 августа 2011

Есть вещи, которые должны произойти до вызова ViewDidLoad. Они могут быть сделаны в конструкторе. Однако следующий ctor плох:

 public TabBarController() : base(NSObjectFlag.Empty)

потому что он не позволяет выполнять ctor по умолчанию UITabController - и его задача - отправить сообщение селектору 'init'.

Я думаю, то, что вы хотите, выглядит примерно так:

public class TabBarController : UITabBarController
{
    UIViewController one = new UIViewController ();
    UIViewController two = new UIViewController ();
    UIViewController three = new UIViewController ();

    private UIView myTabView;

    public UIColor BackgroundColor { 
        get { return myTabView.BackgroundColor; }
        set { myTabView.BackgroundColor = value; }
    }       

    public TabBarController()
    {
        var frame = new RectangleF(0.0f, 0.0f, this.View.Bounds.Size.Width, 46);
        myTabView = new UIView(frame);
        myTabView.Alpha = 0.5f;
        this.TabBar.InsertSubview(myTabView, 0);

        // Add tabs here, which show up correctly (on default background color)
        ViewControllers = new UIViewController[] { one, two, three };
    }
}

    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        TabBarController controller = new TabBarController ();
        // change background (to cyan) works before adding subview
        controller.BackgroundColor = UIColor.Cyan;
        window.AddSubview (controller.View);
        // change background (to blue) works after adding subview
        controller.BackgroundColor = UIColor.Blue;
... 

РЕДАКТИРОВАТЬ: Удалена без фона настройки в .ctor. Добавлен пример кода FinishedLaunching.

...