6

概要

これは、 Xamarinで作成しようとしている最初のアプリです。例から学んでいHello World, iPhoneます。ボタンをクリックするとアプリがクラッシュし、原因がわかりません。

詳細

私はUIViewController単一のシンプルなものを持っていUIButtonます。アウトレットを作成したので、ボタンをクリックすると何かが実行されます。

ボタンの を配線すると、ボタンTouchUpInside eventをクリックするとアプリがクラッシュします。接続されたイベントを削除すると (ただし、アウトレットはまだ存在します)、ボタンをクリックしてもアプリはクラッシュしません。(もちろん、何も配線されていないので何も起こりません)。

私を苛立たせているのは、何が問題なのかわからず、デバッグ情報を使用しても、それを理解できないことです! 私は何年もの間 C# コードを作成してきましたが、特にクラッシュ レポートに情報が不足している場合は、Xam で開始するだけでは少し異なります。いくつかの設定がオフになっている可能性があると思います(たとえば、デバッグ情報がありませんか?)

だからここにいくつかのコードがあります...

AuthenticationViewController
.h ファイル

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>


@interface AuthenticationViewController : UIViewController {
UIButton *_Google;
}

@property (nonatomic, retain) IBOutlet UIButton *Google;

@end

.m ファイル

#import "AuthenticationViewController.h"

@implementation AuthenticationViewController

@synthesize Google = _Google;

@end

デザイナーファイル

using MonoTouch.Foundation;
using System.CodeDom.Compiler;

namespace Foo.Client.iPhone
{

    [Register ("AuthenticationViewController")]
    partial class AuthenticationViewController
    {
        [Outlet]
        MonoTouch.UIKit.UIButton Google { get; set; }

        void ReleaseDesignerOutlets ()
        {
            if (Google != null) {
                Google.Dispose ();
                Google = null;
            }
        }
    }
}

そして最後に、私の

.cs ファイル

using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;

namespace Foo.Client.iPhone
{
    public partial class AuthenticationViewController : UIViewController
    {
        public int xxx = 0;
        public event EventHandler OnAuthenticationCompleted;

        public AuthenticationViewController() 
            : base ("AuthenticationViewController", null)
        {
        }

        public override void DidReceiveMemoryWarning()
        {
            // Releases the view if it doesn't have a superview.
            base.DidReceiveMemoryWarning();

            // Release any cached data, images, etc that aren't in use.
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            Google.TouchUpInside += (sender, e) => 
            {
                xxx++;
            };
        }
    }
}

これは(不足している)クラッシュダンプ/スタックトレースです

2013-10-25 21:37:13.785 FooClientiPhone[8852:1403] MonoTouch: Socket error while connecting to MonoDevelop on 127.0.0.1:10000: Connection refused
mono-rt: Stacktrace:

mono-rt:   at <unknown> <0xffffffff>

mono-rt:   at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) <IL 0x0009f, 0xffffffff>

mono-rt:   at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38

mono-rt:   at Foo.Client.iPhone.Application.Main (string[]) [0x00008] in /Users/PureKrome/Documents/Mac Projects/Foo iOS Client/Code/Foo.Client.iPhone/Main.cs:16

mono-rt:   at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>

mono-rt: 
    Native stacktrace:

 mono-rt: 
    =================================================================
    Got a SIGSEGV while executing native code. This usually indicates
        a fatal error in the mono runtime or one of the native libraries 
            used by your application.
            =================================================================

立ち往生していて、続行する方法がわかりませんか?

さらに、エラーを示すビデオがあります(720p バージョンを選択してください)。

そして、これが解決策です。

4

3 に答える 3

5

これを xCode の観点から見ると、IBOutlet がアプリのクラッシュを引き起こしていると思います。IBOutlets は、メソッドの呼び出しではなく状態に使用されるためです。この場合、ボタンを IBAction に接続する必要があります。

- (IBAction)Google:(id)sender; 

最終的に次のように呼び出されます:

Google.TouchUpInside += (sender, e) => 
            {
                xxx++;
            };

@synthesize Google = _Google;また、最新の Objective-C では、自動的に行われる必要がないことに注意してください。

happy x(アマリン)コーディング。

于 2014-09-12T04:33:34.363 に答える
1

シンプルな Hello World のコードをたくさん書く

これはあなたが必要としないものです

@property (nonatomic, retain) IBOutlet UIButton *Google;
@synthesize Google = _Google;

using  MonoTouch . Foundation ; 
using  System . CodeDom . Compiler ; 

namespace  Foo . Client . iPhone
{ 

[ Register  ( "AuthenticationViewController" )] 
partial  class  AuthenticationViewController 
{ 
    [ Outlet ] 
    MonoTouch . UIKit . UIButton  Google  {  get ;  set ;  } 

    void  ReleaseDesignerOutlets  () 
    { 
        if  ( Google  !=  null )  { 
            Google . Dispose  (); 
            Google  =  null ; 
        } 
       } 
    } 
   }
  using System;
  using System.Drawing;
  using MonoTouch.Foundation;
  using MonoTouch.UIKit;

  namespace Foo.Client.iPhone
 {
 public partial class AuthenticationViewController : UIViewController
 {
    public int xxx = 0;
    public event EventHandler OnAuthenticationCompleted;

    public AuthenticationViewController() 
        : base ("AuthenticationViewController", null)
    {
    }

    public override void DidReceiveMemoryWarning()
    {
        // Releases the view if it doesn't have a superview.
        base.DidReceiveMemoryWarning();

        // Release any cached data, images, etc that aren't in use.
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        Google.TouchUpInside += (sender, e) => 
        {
            xxx++;
        };
    }
   }
   } 2013-10-25 21:37:13.785 FooClientiPhone[8852:1403] MonoTouch: Socket error while           connecting to MonoDevelop on 127.0.0.1:10000: Connection refused
    mono-rt: Stacktrace:

   mono-rt:   at <unknown> <0xffffffff>

  mono-rt:   at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain         (int,string[],intptr,intptr) <IL 0x0009f, 0xffffffff>

  mono-rt:   at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38

  mono-rt:   at Foo.Client.iPhone.Application.Main (string[]) [0x00008] in /Users/PureKrome/Documents/Mac Projects/Foo iOS Client/Code/Foo.Client.iPhone/Main.cs:16

mono-rt:   at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object          (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>

   mono-rt: 
   Native stacktrace:
  mono-rt: 
   =================================================================
    Got a SIGSEGV while executing native code. This usually indicates
    a fatal error in the mono runtime or one of the native libraries 
        used by your application.
        =================================================================

ボタンでHello Worldを作ればこんなものはいらない

Hello World を作成するには、これだけが必要です

@interface ViewController ()


@property (nonatomic, strong) UILabel *myLabel;



@implementation ViewController

- (IBAction)myButton:(id)sender 
{ 
  _myLabel.Text = @"Hello World ";
}
@end
于 2014-09-16T12:37:15.867 に答える
1

これは、何かへの参照が失われている可能性があることを示しています。誰かがゾンビを有効にすると言っていることは知っていますが、これはラッパー/コンパイラのオプションではないかもしれません。

mono-rt:   at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>

置き換えてみてください:

@interface AuthenticationViewController : UIViewController {
    UIButton *_Google; 
}

@property (nonatomic, retain) IBOutlet UIButton *Google;

だけで:

@interface AuthenticationViewController : UIViewController 
@property (nonatomic, retain) IBOutlet UIButton *Google;

おそらく、そのボタンをクリックしたときに、コンパイラは何について話しているのかを知りません。

于 2014-09-16T15:09:12.797 に答える