2013-10-28 8 views
5

Sommario
Questa è la mia prima app che sto cercando di fare con Xamarin. Sto imparando dall'esempio Hello World, iPhone. Quando faccio clic sul mio pulsante, l'app si arresta in modo anomalo e non riesco a capire perché.L'app iOS si arresta in modo anomalo quando faccio clic sul mio UIButton - non riesco a capire perché?

dettagli
Ho un semplice UIViewController con un singolo UIButton. Ho creato un punto vendita, quindi quando clicco sul pulsante, faccio qualcosa.

Quando collego il pulsante TouchUpInside event, l'app si arresta in modo anomalo quando faccio clic sul pulsante. Quando rimuovo l'evento cablato (ma la presa esiste ancora), l'app non si arresta quando faccio clic sul pulsante. (Naturalmente, non succede nulla perché non è collegato nulla).

Ciò che mi uccide è che non ho idea di cosa non funzioni e di utilizzare le informazioni di debug, non riesco a capirlo! Ho fatto il codice C# per anni, ma solo iniziare in Xam è un po 'diverso, specialmente quando il rapporto di crash è .. beh .. privo di informazioni :(Immagino che potrei avere alcune impostazioni spuntate (es. senza informazioni di debug?)

Quindi, ecco un po 'di codice ...

AuthenticationViewController
file h

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


@interface AuthenticationViewController : UIViewController { 
UIButton *_Google; 
} 

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

@end 

di file .m

#import "AuthenticationViewController.h" 

@implementation AuthenticationViewController 

@synthesize Google = _Google; 

@end 

file di progettazione

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; 
      } 
     } 
    } 
} 

e, infine, il mio file

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++; 
      }; 
     } 
    } 
} 

Oh - e il colpo soldi ... la (carente) crash dump/stack trace

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. 
      ================================================================= 

Sono bloccato e non ho idea di come continuare? Ho già passato un certo numero di ore a provare varie cose per farlo funzionare.

Ulteriori informazioni, here's a video showing the error (selezionare la versione 720p).

ed ecco lo solution, zipped up.

Apprezzerei qualsiasi aiuto -> e non dire: eccolo, risolto. ma .. non hai fatto questo e quello .. e hai bisogno di fare quelle cose così xxxx funziona.

Qualche suggerimento, per favore?

+0

L'arresto si verifica quando si esegue l'applicazione senza eseguire il debug? –

+0

Sì. si verifica anche allora. –

risposta

5

Guardando questo da un punto di vista xCode penso che IBOutlet stia causando l'arresto anomalo dell'app. Semplicemente perché gli IBOutlet sono usati per lo stato piuttosto che per i metodi di chiamata.In questo caso, è necessario collegare il pulsante per un IBAction:

- (IBAction)Google:(id)sender; 

che alla fine chiama il numero:

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

Si noti inoltre che nella moderna Objective-C non occorre @synthesize Google = _Google; che accadrà automaticamente.

felice x (amarin) codifica.

1

si scrive un sacco di codice per un semplice ciao mondo

questo è ciò che NON è necessario

@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. 
     ================================================================= 

Quindi, se si effettua un mondo ciao con un pulsante Non c'è bisogno di tutto questo

per fare un mondo ciao ha solo bisogno di questo

@interface ViewController() 


@property (nonatomic, strong) UILabel *myLabel; 



@implementation ViewController 

- (IBAction)myButton:(id)sender 
{ 
    _myLabel.Text = @"Hello World "; 
} 
@end 
+2

La rimozione di codice non necessario è sempre buona. Ma forse il richiedente ne ha avuto bisogno e questo ha causato l'incidente. Qualche idea o commento su cosa potrebbe aver causato l'incidente? – Trilarion

1

T il suo ci dice forse stiamo perdendo il riferimento a qualcosa. So che qualcuno ha già detto di abilitare gli zombi, ma questo potrebbe non essere un'opzione con il tuo wrapper/compilatore.

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

provare a sostituire:

@interface AuthenticationViewController : UIViewController { 
    UIButton *_Google; 
} 

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

Con solo:

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

Forse il compilatore non sa cosa si sta parlando quando si fa clic su tale pulsante.

Problemi correlati