У меня была эта ошибка, когда я пытался установить значения 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
}
Надеюсь, этот ответ поможет кому-то там с той же проблемой, что и я заметил, что заметный ответ - отличный ресурс для понимания опций и того, как они работают, но не затронул проблему напрямую.
Можно попробовать:
<conversionPattern
value="%date %-5level %logger ${COMPUTERNAME} [%property{SessionID}] - %message%newline" />
... в Вашем Web.config, и в Global.asax.cs:
protected void Session_Start(object sender, EventArgs e)
{
log4net.ThreadContext.Properties["SessionID"] = Session.SessionID;
log4net.Config.XmlConfigurator.Configure();
}
ОБНОВЛЕНИЕ (2014-06-12): Начиная с log4net 1.2.11, вы можете использовать % aspnet-request {ASP.NET_SessionId }
в шаблоне преобразования для этой цели.
Ссылки: https://issues.apache.org/jira/browse/LOG4NET-87 http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html
Вы должен создать обработчик Application_PostAcquireRequestState в Global.asax.cs (он вызывается в каждом запросе):
protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
log4net.ThreadContext.Properties["SessionID"] = Session.SessionID;
}
И добавить [% property {SessionID}] в conversionPattern.
Кто-то поправляет меня, если я ошибаюсь, но один поток ASP.NET может обрабатывать несколько сеансов, поэтому вы не можете использовать Session_Start, поскольку он вызывается один раз при запуске сеанса. Это означает, что как только другой пользователь получает доступ к веб-сайту, ваш log4net.ThreadContext может быть перезаписан новой информацией пользователя.
Вы можете поместить приведенный ниже код в Application_AcquireRequestState или создать HttpModule и сделать это в методе AcquireRequestState. AcquireRequestState вызывается, когда среда выполнения ASP.NET готова получить состояние сеанса текущего HTTP-запроса. Если вы заинтересованы в получении имени пользователя, вы можете сделать это в AuthenticateRequest, который вызывается, когда среда выполнения ASP.NET готова аутентифицировать личность пользователя (и до AcquireRequestState).
private void AcquireRequestState(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
log4net.ThreadContext.Properties["SessionId"] = context.Session.SessionID;
}
После этого вы можете настроить свой log4net.