本文介绍了ui工具包中的错误一致性错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

访问视图控制器.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工具包中的错误一致性错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-26 22:59