#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. Следовательно, необходимость в локальной переменной для ввода правильного значения в лямбда.