У меня была эта ошибка, когда я пытался установить значения Outlets из метода подготовки к методу segue следующим образом:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? DestinationVC{
if let item = sender as? DataItem{
// This line pops up the error
destination.nameLabel.text = item.name
}
}
}
Тогда я узнал, что не могу установить значения выходы контроллера контроллера, потому что контроллер еще не был загружен или инициализирован.
Поэтому я решил это следующим образом:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? DestinationVC{
if let item = sender as? DataItem{
// Created this method in the destination Controller to update its outlets after it's being initialized and loaded
destination.updateView(itemData: item)
}
}
}
Destination Controller:
// This variable to hold the data received to update the Label text after the VIEW DID LOAD
var name = ""
// Outlets
@IBOutlet weak var nameLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
nameLabel.text = name
}
func updateView(itemDate: ObjectModel) {
name = itemDate.name
}
Надеюсь, этот ответ поможет кому-то там с той же проблемой, что и я заметил, что заметный ответ - отличный ресурс для понимания опций и того, как они работают, но не затронул проблему напрямую.
Уверенный:
добавленный 5/25/10
добавленный 7/27/10
добавленный 11/22/11
я просто добавляю к списку, поскольку они происходят со мной...
Когда выполнение чего-либо с OutlookSession, всегда
OpenNet CF стоит изучить - даже свободный выпуск имеет, некоторые полезные освобождают - такие как FTP, datagrid дополнительная функциональность и т.д.; который очень полезен, так как CF испытывает недостаток в большом количестве функций платформы .NET.
Большая часть необычного материала требует прямого вызова Windows API через P/Invoke. Я нашел http://www.pinvoke.net/ быть большим ресурсом для P/Invoke и на Win32 и на Windows CE.
Если необходимо поддерживать несколько экранных размеров/разрешений, наследование формы является отличным способом сделать это. В основном Вы разрабатываете свою форму для установки стандарту 320x240 экран. Для поддержки различного размера экрана Вы просто добавляете новую форму, наследовались Вашей пользовательской форме (вместо просто Формы), и затем перестраиваете средства управления по мере необходимости.
Другой полезный прием должен обернуть вызов ShowDialog способом, который позволяет Вам установить подпись родительской формы на "" временно - это сохраняет все открытые формы в Вашем приложении от разоблачения в под управлением списке программ. Другой способ улучшить обертку к PInvoke SetForegroundWindow с дескриптором родительского окна. Это гарантирует, что родитель будет всегда вновь появляться после того, как дочерний элемент закрывается; без этого вызова для других окон возможно быть вставленным в z-стек выше родительской формы.
Не упускают шифрование на SD-карте. SqlCE прекратит работать в целом. Поведение Oracle Lite при шифровании является намного более зловещим, начиная с частей его работа и части ее не делают.
Избегают репликация слияния и SqlCE RDA. Они были бы фантастическими инструментами, если бы они работали надежно, но они не делают в ситуациях, где сетевое соединение может неожиданно быть отброшено во время репликации (довольно распространенный в мире WM). Этот укусил меня ТРУДНО с производственным приложением. Технология поддержки MS, с которой мы имели дело, была наконец вынуждена подтвердить, что она просто не работает 100%. Фактическая кавычка: "просто продолжайте пытаться копировать - они объединятся правильно в конечном счете".
Это не характерно для всего Компактные устройства Платформы, однако это поднимает, это - ужасная голова намного больше при разработке на них из-за ограничительной разработки ресурса на мобильной платформе.
<час>Недавно я столкнулся с большим сообщением части потока при управлении утечками памяти, которые помогли мне определить утечку, о которой я не знал в ошибка при установке DataGrid. DataSource в одном из наших мобильных приложений.
При привязке DataGrid, Вы должны не непосредственно использование что-то как:
dgDataGrid.DataSource = dsDataSet;
, Поскольку это создает новый CurrencyManager каждый раз, который правильно не становится избавленным. Вместо этого Вы хотите связать DataGrid с BindingSource сначала для предотвращения утечки ресурсов.
bsData.DataSource = dsDataSet;
dgDataGrid.DataSource = bsData;
, Кто знал? Scott Langham сделал в другое сообщение . Спасибо Scott!
OpenNETCF является большим ресурсом.
Их Платформа Интеллектуального устройства является реальным, должен иметь при разработке с.NET Компактной Платформы, поскольку столь многие Полные функции платформы отсутствуют [я думаю, что кто-то когда-то сказал.NET, Компактная Платформа является оберткой вокруг NotImplementedException!]
При использовании DataGrid, который можно отсортировать, это - содержание через заголовки столбцов при помощи следующего кода, первоначально размещенного в блоге Chris Craft's:
using System.Windows.Forms;
using System.Data;
public static void SortDataGrid(object sender, System.Windows.Forms.MouseEventArgs e)
{
DataGrid.HitTestInfo hitTest;
DataTable dataTable;
DataView dataView;
string columnName;
DataGrid dataGrid;
// Use only left mouse button clicks.
if (e.Button == MouseButtons.Left)
{
// Set dataGrid equal to the object that called this event handler.
dataGrid = (DataGrid)sender;
// Perform a hit test to determine where the mousedown event occured.
hitTest = dataGrid.HitTest(e.X, e.Y);
// If the MouseDown event occured on a column header,
// then perform the sorting operation.
if (hitTest.Type == DataGrid.HitTestType.ColumnHeader)
{
// Get the DataTable associated with this datagrid.
dataTable = (DataTable)dataGrid.DataSource;
// Get the DataView associated with the DataTable.
dataView = dataTable.DefaultView;
// Get the name of the column that was clicked.
if(dataGrid.TableStyles.Count != 0)
columnName = dataGrid.TableStyles[0].GridColumnStyles[hitTest.Column].MappingName;
else
columnName = dataTable.Columns[hitTest.Column].ColumnName;
// If the sort property of the DataView is already the current
// column name, sort that column in descending order.
// Otherwise, sort on the column name.
if (dataView.Sort == columnName)
dataView.Sort = columnName + " DESC";
else
dataView.Sort = columnName;
}
}
}
private void dgDataGrid_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(dgDataGrid.VisibleRowCount == 0) return;
SortDataGrid(sender, e);
dgDataGrid.Select(dgDataGrid.CurrentRowIndex);
}
Модульное тестирование (TDD) возможно на .net см. Но есть проблемы.
Вы будете использовать MSTest. Не NUnit, MBUnit, XUnit.net и т. Д. MSTest.
Вам понадобится Visual Studio Professional (насколько я могу судить). Самый простой способ начать работу - щелкнуть правой кнопкой мыши метод, который вы хотите протестировать, затем выбрать «Создать модульный тест». Это настраивает тестовый проект для вас. Создайте только один тестовый проект. Это не нравится иметь несколько. Просто сделайте это, чтобы создать проект и получить все настройки зависимостей для вас. Затем создайте свои собственные тестовые классы.
Могут возникнуть проблемы с фиктивными объектами. RhinoMocks, Moq и TypeMock зависят от того, чего нет в .net cf. У Пекса есть проект «Заглушки», который я до сих пор изучаю. Pex - это исследовательский проект Microsoft. В итоге вы создадите пользовательские поддельные объекты.
Тест запускается на эмуляторе устройства. Это означает, что они должны быть развернуты. Если при первом запуске тестера вы получите странную ошибку, вероятно, у вас еще нет .net 3.5 в эмуляторе устройства. Сначала разверните ваш проект, затем снова запустите тесты.
На стороне, не связанной с тестированием: You do get LINQ to Objects and LINQ to XML. Both are a godsend. You can talk to a server via WCF, but you don't get all of the endpoints.
Вы столкнетесь с множеством ошибок и ограничений в .net cf. Вам придется по-обезьяньи исправлять их. это некрасиво, но у вас не будет выбора.
В итоге вам придется написать множество собственных элементов управления. Поскольку большинство элементов управления в фреймворке не поддерживают функции, которые часто запрашиваются клиентами. Поэтому хорошей практикой является создание собственных элементов управления для каждого элемента управления, который вы используете с самого начала. Даже если в начале работы в них может ничего не быть. Позже вы сможете добавить пользовательскую логику. Без необходимости изменять много существующего кода.
Если вам нужна валидация, вы можете использовать .net validation framework
Это все, что я могу вспомнить прямо сейчас.