Автоматически сгенерированный выход в Designer.cs типа подкласса

Я хочу знать, возможно ли для Xamarin Studio установить тип автоматически сгенерированного выхода, скажем, myview.designer.cs в подкласс элемента управления в .xib.

Например, я создал подкласс NSButton, чтобы создать некоторый пользовательский интерфейс для кнопок во всем приложении.

У меня есть мой класс, определенный как что-то вроде этого, с использованием атрибута Register, чтобы он был виден во время выполнения Objective-C:

[Register("AppButton")]
public class AppButton : NSButton
{
    ...
}

Затем в XCode я установил пользовательский класс AppButton на моем NSButtons. Если я открою .xib в текстовом редакторе, я увижу атрибут customClass на своих кнопках:

<button id="bxh-qr-g81" ... customClass="AppButton">

Но когда Xamarin Studio прослушивает изменения и обновляет файл конструктора, я всегда получаю выход с типом NSButton вместо AppButton.

[Register ("MyView")]
partial class MyView
{
    [Outlet]
    AppKit.NSButton MyButton { get; set; }

    ...
}

Я хотел бы, чтобы это был тип моего пользовательского класса:

[Register ("MyView")]
partial class MyView
{
    [Outlet]
    AppButton MyButton { get; set; }

    ...
}

Основная причина этого в том, что я хочу установить некоторые свойства в пределах AwakeFromNib, и немного утомительно приводить их каждый раз. Также было бы хорошо, если бы компилятор выдал ошибку, если тип изменился, а не ошибку времени выполнения, если я не проверяю, что это действительно тип AppButton.

Если бы я мог установить свойства непосредственно в моем подклассе в XCode, это не было бы проблемой. Но, насколько я могу судить, IBInspectable или IBDesignable не поддерживается Xamarin.


person Darren Hale    schedule 20.10.2015    source источник


Ответы (1)


Я заставил это работать:

  • Создание подкласса, как показано ниже
  • Первая сборка студии Xamarin
  • открытие проверки xcode для файлов CustomButton.h и CustomButton.m
  • Установите тип класса в xcode, он должен появиться в раскрывающемся списке: введите здесь описание изображения
  • Создание розеток снова. тогда должно выглядеть так:

    [Outlet]
    AppName.iOS.CustomButton customButton { get; set; }
    

Я думаю, вы имеете в виду UIButton тоже не NSButton

using System;
using UIKit;
using Foundation;

namespace EdFringe.iOS
{
    [Register ("CustomButton")]
    public class CustomButton : UIButton
    {
        public CustomButton ()
        {
        }

        public CustomButton (IntPtr p) : base(p)
        {
            //this one i think is used to create the obj-c object.
        }

        public CustomButton (NSCoder coder) : base(coder)
        {
            // This one i think is used when creating the xib.
        }

        //Custom stuff here
    }
}
person Iain Smith    schedule 27.05.2016
comment
Ваш подход работает. Я думаю, что ключевое отличие заключается в том, что вы создаете выходы после установки пользовательского класса. Если вы сначала создадите выход, а затем установите пользовательский класс, он все равно будет иметь тип NSButton, а не AppButton в designer.cs. Итак, я предполагаю, что проблема в том, что Xamarin Studio не обнаруживает, что тип изменился. По крайней мере, это то, что у меня происходит в версии 5.10.3. Мне все еще не нравится идея, что пользовательский класс может измениться, а тип не изменится в designer.cs. Мы используем Cocoa для приложения OS X, а не Cocoa Touch, поэтому для нас это NSButtons. - person Darren Hale; 27.05.2016
comment
Ах, извините, мало сделал OSX dev, подумал, что это опечатка. Да, когда я тестировал, это работало только в таком порядке, не очень хорошо, что изменения не учитывались после установки выхода, это могло привести к ошибке. - person Iain Smith; 27.05.2016