Как я могу иметь несколько UITableViewCell в одном NIB-файле в приложении MonoTouch для iPhone? - PullRequest
1 голос
/ 01 апреля 2011

В MonoTouch есть много примеров, когда люди загружают файлы NIB, как это:

var customController = new MyCustomController();
NSBundle.MainBundle.LoadNib("MyCustomController", customController, null);

Основываясь на многих примерах кода, которые я видел в постах блога, люди склонны делать это для пользовательских UITableViewCells, которыеони спроектированы в Интерфейсном Разработчике.

Это все хорошо, но, возможно, файл NIB содержит несколько пользовательских UITableViewCell.Я нашел сообщение в блоге, в котором показан используемый файл NIB, содержащий несколько пользовательских ячеек таблицы (в Objective-C): http://pegolon.wordpress.com/2008/11/15/using-uitableviewcell-with-interfacebuilder/

Это делает то, что я хочу!

ВВ этом примере Objective C становится ясно, что NSBundle.MainBundle.LoadNib действительно что-то возвращает (NSArray), а затем возвращаемый объект перебирается: каждый объект в NSArray представляет собой «шаблон» ячейки таблицы.

Когда я пытаюсь сделать это в MonoTouch / C #, я пытаюсь перебрать возвращенный NSArray.Он не позволяет мне получать доступ к его содержимому с помощью индексаторов массива, и не позволяет мне зацикливаться на нем.

Как я могу это сделать?

Ответы [ 4 ]

3 голосов
/ 04 апреля 2011

Хорошо, мне удалось заставить его работать.Важно то, как получить объекты из NSArray:

NSArray nsArr = NSBundle.MainBundle.LoadNib("MyCustomController", customController, null);
UITableViewCell = (UITableViewCell)Runtime.GetNSObject(nsArr.ValueAt(0)); // gets the first item

Я также создал пример проекта и статью о том, как использовать пользовательские ячейки таблицы из файлов пера:

Настольные ячейки в MonoTouch

2 голосов
/ 28 февраля 2012

Как упоминалось в комментарии к ответу Эдуардо Скоса, описанный рабочий процесс невозможен в XCode 4 без некоторой настройки.Интерфейсный конструктор в XCode 4 не может подкласс для вас, вы должны сделать это самостоятельно.Вот полный рабочий процесс в MonoTouch для создания подклассного представления без контроллера.Это полезно для ячеек табличного представления и других повторно используемых представлений.

  1. Начните с создания нового пустого класса в MonoTouch.Назовите класс как угодно.
  2. Откройте только что созданный файл класса и наследуйте от класса, который вы хотите.(UIView, UITableViewCell и т. Д.)
  3. Добавьте атрибут [Register("yourClassName")] в класс .
  4. Добавьте нужные розетки, создав свойство (оно не имеетдля публики) с автоматическим получателем и установщиком.Добавьте атрибут [Outlet] к свойству.
  5. Добавьте действия в класс, если хотите.Объявите их так: [Action("MethodName")] public void MethodName(NSObject sender) {}.Я считаю, что можно также объявить метод закрытым, но я не пробовал его.
  6. Создайте метод конструктора со следующей сигнатурой: public YourClassName(IntPtr ptr) : base(ptr) {}.Если вы забудете этот шаг, вы получите исключение при попытке загрузить файл XIB из кода, сообщив, что он не может найти этот конструктор.
  7. Убедитесь, что вы сохранили файл.
  8. Теперь добавьте новый вид iPhone или iPad в ваш проект.(Просто представление, не представление контроллер )
  9. Откройте представление в Интерфейсном Разработчике, дважды щелкнув представление в MonoDevelop.
  10. В ИнтерфейсеBuilder, выберите представление, которое уже существует, и откройте Identity Inspector.
  11. Измените класс на имя класса, созданного ранее.Интерфейсный Разработчик должен автоматически заполнить имя для вас.
  12. Теперь настройте свой вид с помощью меток, кнопок и т. Д.
  13. Теперь, включите Ассистент В Интерфейсном Разработчике, если он еще не включен
  14. Просто посмотрите на это!Все выходы и действия, которые вы сделали в файле класса C #, относятся к классу Objective C, который показывает помощник.Теперь вы можете подключить элементы управления в вашем представлении к существующим выходам и действиям.
  15. Когда вы закончите, убедитесь, что вы сохранили файл XIB, который вы редактировали, и вернитесь в MonoDevelop.

Чтобы создать экземпляр представления, вы делаете так, как писал Димитрис:

NSArray nsArr = NSBundle.MainBundle.LoadNib("YourViewName", theController, null);
YourClassName instantiatedView = (YourClassName)Runtime.GetNSObject(nsArr.ValueAt(0));

theController - это контроллер представления, который будет установлен как владелец файла представления.Насколько я знаю, вы должны передать действительный View Controller в метод.Если вы создаете экземпляр представления в View Controller, вы можете передать this методу.И теперь вы можете использовать любые свойства или методы, которые вы определили в своем представлении, чтобы изменить его внешний вид.Так что, если вы подключили UILabel к свойству аутлета Name (и оно объявлено как общедоступное), вы можете использовать instantiatedView.Name.Text = "John Doe"; Однако вы не должны использовать эту технику, чтобы избавиться от контроллера представления во всех ситуациях.Контроллер представления существует для разделения обязанностей.Поэтому, если вам нужна более сложная логика для представления, вам следует пересмотреть, если это правильный путь.

1 голос
/ 01 апреля 2011

Признаюсь, я не справился с этим и принял обходной путь.Я заставил свой конструктор ячеек прикрепить ссылку на себя в статической переменной, а затем обратился к нему после LoadNib.

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

public partial class OrderPrimary : UITableViewCell
{
    static OrderPrimary lastCell;

    public OrderPrimary(IntPtr handle) : base(handle)
    {
         lastCell=this;
    }

    static public OrderPrimary NewCell()
    {
         NSObject obj=new NSObject();
         NSBundle.MainBundle.LoadNib("OrderPrimary",obj,null);

         return lastCell;
    }
}

Не большой или умный, но у меня работает.Я не мог понять, как это сделать другим способом ... комментарии приветствуются!

Обратите внимание, что в этом примере у меня только один вид в XIB.

0 голосов
/ 02 апреля 2011

Я не пробовал это для представлений ячейки, но я думаю, что лучший способ заставить это работать должным образом - использовать наследование от конструктора интерфейса при определении вашей ячейки.

По сути, вы должны определить подкласс UITableCellView в IB (щелкните правой кнопкой мыши класс и выберите «добавить подкласс»).Используйте этот класс для создания ячейки.Когда MonoTouch обновит файл .cs.design в вашем проекте, он создаст частичные классы для тех типов, которые вам придется завершить реализацию (убедитесь, что ваша реализация наследуется от UITableViewCell. После этого это должно быть просто вопросомсоздания новых ячеек с new CustomTableViewCell().

Я недавно писал об этом, используя UIViews, но процесс должен быть одинаковым для ячеек: http://escoz.com/monotouch-tip-inherit-uiviews-all-the-time/. Надеюсь, это поможет.

...