Монотоуч.Диалоговое окно — Какой элемент был задействован

#iphone #xamarin.ios #monotouch.dialog

#iPhone #xamarin.ios #monotouch.dialog

Вопрос:

У меня есть список клиентов, которые я использую для создания подобных элементов:

 Foreach(Customer c in Customers)
{
    //Make the StyledStringElement
    //Set the Tapped to action a touch
    element.Tapped  = () => {  Push (new SomeController (c.ClientId)); };
}
  

Проблема в том, что при задействовании элемента он отправляет последнего клиента в someController().

Как я могу задать задействованному делегату информацию, которая будет идентифицировать клиента?

Ответ №1:

Вам нужно сохранить клиента в качестве локальной переменной в цикле:

 foreach(Customer c in Customers)
{    
    //Make the StyledStringElement
    //Set the Tapped to action a touch
    var currentCustomer = c;
    element.Tapped  = () => {  Push (new SomeController (currentCustomer.ClientId)); };
}
  

Но это не ограничение для MonoTouch.Диалоговое окно. Вот статья об общей проблеме.

Комментарии:

1. Эта статья фантастическая. В прошлом я сталкивался с этой проблемой и решал ее самостоятельно, но анализ Резника потрясающий. Базовая разбивка: действие, которое выполняет lamda, создается, как только это необходимо в runtime…at в этот момент итератор в инструкции foreach уже был перемещен в конец collection…so последнее значение в коллекции — это то, что будет использоваться в действии lamda. Следовательно, необходимость в локальной переменной для ввода правильного значения в лямбда.