问题描述
访问视图控制器.cs文件中的文本框时出现问题
I am having a issue accesing a text box in a view controller .cs file
async partial void loginUser(UIButton sender)
{
// Show the progressBar as the MainActivity is being loade
Console.WriteLine("Entered email : " + txtEmail.Text);
// Create user object from entered email
mCurrentUser = mJsonHandler.DeserialiseUser(txtEmail.Text);
try
{
Console.WriteLine("Starting network check");
// Calls email check to see if a registered email address has been entered
if (EmailCheck(txtEmail.Text) == true)
{
await CheckPassword();
}
else
{
UIAlertView alert = new UIAlertView()
{
Title = "Login Alert",
Message = "Incorrect email or password entered"
};
alert.AddButton("OK");
alert.Show();
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("An error has occured: '{0}'", ex);
}
在此功能中,它抱怨无法访问aynsc方法上的文本框
It is within this funciton that it complains it cannot access a text box which is on a aynsc method
public Task CheckPassword()
{
return Task.Run(() =>
{
// Creates instance of password hash to compare plain text and encrypted passwords.
PasswordHash hash = new PasswordHash();
// Checks password with registered user password to confirm access to account.
if (hash.ValidatePassword(txtPassword.Text ,mCurrentUser.password)==true)
{
Console.WriteLine("Password correct");
UIAlertView alert = new UIAlertView()
{
Title = "Login Alert",
Message = "Password Correct Loggin In"
};
alert.AddButton("OK");
alert.Show();
//insert intent call to successful login here.
}
else
{
UIAlertView alert = new UIAlertView()
{
Title = "Login Alert",
Message = "Incorrect email or password entered"
};
alert.AddButton("OK");
alert.Show();
}
Console.WriteLine("Finished check password");
});
}
此行会发生错误:
txtPassword.Text
错误如下:
即使我输入的密码正确,也不会显示.我是否必须在单独的线程上运行UI警报?
Also my Password Correct does not show even though if it is a correct password.Do i have to run the UI Alerts on a seperate thread?
推荐答案
任何UIKit方法都必须从UI线程(或Main线程,Main队列等)中调用.这样可以确保UI的一致性.Xamarin将在调试模式下向所有UIKit方法添加检查,如果尝试使用后台线程更改UI,则会引发该异常.
Any UIKit methods must be called from the UI thread (or Main thread, Main queue, etc.). This ensures consistency in the UI. Xamarin adds a check to all UIKit methods in debug mode and throws that exception if you try to use a background thread to change the UI.
解决方案很简单:仅从UI线程修改UI.从本质上讲,这意味着如果您正在使用前面带有"UI"的类,则可能应该从UI线程进行操作.(这是经验法则,UI线程上还有其他时间.)
The solution is simple: only modify the UI from the UI thread. That essentially means if you're using a class with "UI" in front it, you should probably do it from the UI thread. (That's a rule of thumb and there are other times to be on the UI thread).
如何在这个神话般的UI线程上获取代码?我很高兴你问.在iOS中,您有几种选择:
How do I get my code on this mythical UI thread? I'm glad you asked. In iOS, you have a few options:
- 在NSObject的子类中,
InvokeOnMainThread
可以解决问题. - 在任何地方,
CoreFoundation.DispatchQueue.MainQueue.DispatchAsync
始终可以正常工作.
- When in a subclass of NSObject,
InvokeOnMainThread
will do the trick. - From anywhere,
CoreFoundation.DispatchQueue.MainQueue.DispatchAsync
will always work.
这两种方法都只接受 Action
,可以是lambda或方法.
Both of those methods just accept an Action
, which can be a lambda or a method.
因此,在您的代码中,如果我们添加 InvokeOnMainThread
(因为我认为这在您的 UIViewController
子类中)...
So in your code, if we add an InvokeOnMainThread
(because I think this is in your UIViewController
subclass)...
public Task CheckPassword()
{
return Task.Run(() =>
{
// Creates instance of password hash to compare plain text and encrypted passwords.
PasswordHash hash = new PasswordHash();
// Checks password with registered user password to confirm access to account.
InvokeOnMainThread(() => {
if (hash.ValidatePassword(txtPassword.Text ,mCurrentUser.password)==true)
{
Console.WriteLine("Password correct");
UIAlertView alert = new UIAlertView()
{
Title = "Login Alert",
Message = "Password Correct Loggin In"
};
alert.AddButton("OK");
alert.Show();
//insert intent call to successful login here.
}
else
{
UIAlertView alert = new UIAlertView()
{
Title = "Login Alert",
Message = "Incorrect email or password entered"
};
alert.AddButton("OK");
alert.Show();
}
});
Console.WriteLine("Finished check password");
});
}
这篇关于ui工具包中的错误一致性错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!