2012-01-10 35 views
6

Me enseño a mí mismo Objective-C y iOS programación con "IOS Programming: The Big Nerd Ranch guide (2nd Edition) y me encontré con un problema donde el tutorial quiere que cree conexiones a un objeto delegado de la aplicación, pero este objeto no aparece en la lista de objetos en el constructor Interfaz para mí. Estoy bastante seguro de que es un error tipográfico o una versión diferente, ya que el libro está ligeramente por detrás de mi versión de Xcode (4.2). he incluido el código. Estoy bastante seguro de que el objeto MOCAppDelegate es lo que debería aparecer en IB, pero aún no estoy lo suficientemente familiar como para saber qué cambios de código necesito para que eso ocurra. Pregunta específica: ¿Cómo ajusto el código? a continuación para que obtenga un objeto en la lista de Objetos en IB para que pueda realizar las conexiones como se indica en el gráfico del tutorial?Xcode Interface Builder No muestra App Delegate Object

Nota: Me investigó y encontró esto: Having trouble hooking up instance variables to AppDelegate pero esta solución no funciona para mí (o que no aplicó correctamente)

ScreenShot del encabezado del archivo

#import <UIKit/UIKit.h> 
#import <CoreLocation/CoreLocation.h> 
#import <MapKit/MapKit.h> 

@interface MOCAppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate> 
{ 
    CLLocationManager *locationManager; 

    IBOutlet MKMapView *worldView; 
    IBOutlet UIActivityIndicatorView *activityIndicator; 
    IBOutlet UITextField *locationTitleField; 
} 

@property (strong, nonatomic) IBOutlet UIWindow *window; 


@end 

Implementación del archivo

#import "MOCAppDelegate.h" 

@implementation MOCAppDelegate 

@synthesize window = _window; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    //Create location manager object 
    locationManager = [[CLLocationManager alloc] init]; 
    [locationManager setDelegate:self]; 

    //We want all results from the location manager 
    [locationManager setDistanceFilter:kCLDistanceFilterNone]; 

    //And we want it to be as accurate as possible 
    //regardless of how much time/power it takes 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 

    //Tell our location manager to start looking for it location immediately 
    [locationManager startUpdatingLocation]; 

    //We also want to know our heading 
    if (locationManager.headingAvailable == true) { 
     [locationManager startUpdatingHeading]; 
    } 


    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor darkGrayColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
    NSLog(@"%@", newLocation); 
} 

- (void)locationManager:(CLLocationManager *)manager 
     didUpdateHeading:(CLHeading *)newHeading 
{ 
    NSLog(@"%@", newHeading); 
} 

- (void)locationManager:(CLLocationManager *)manager 
     didFailWithError:(NSError *)error 
{ 
    NSLog(@"Could not find location: %@", error); 
} 

- (void)dealloc 
{ 
    if([locationManager delegate] == self) 
     [locationManager setDelegate:nil]; 
} 

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    /* 
    Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
    Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 
    */ 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    /* 
    Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    */ 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    /* 
    Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 
    */ 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    /* 
    Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
    */ 
} 

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    /* 
    Called when the application is about to terminate. 
    Save data if appropriate. 
    See also applicationDidEnterBackground:. 
    */ 
} 

@end 

Respuesta

14

Arrastre una instancia de NSObject en su .xib y suéltelo en la sección de Objetos tal como lo indica en las instrucciones que tiene. Luego, selecciónelo y cambie su tipo en el inspector de identidad (en el lado derecho, donde dice "Clase personalizada") a "MOCAppDelegate" (o la clase que desee).

+3

¡Gracias! Este paso fundamental fue omitido en la mayoría de las guías. – pretzels1337

+1

También estoy agradecido. Hay algunos documentos que necesitan ser actualizados. ¡Felicitaciones a Stack Overflow por mostrar preguntas similares mientras escribes las tuyas! – McUsr

0

MOCAppDelegate = AppDelegate

La c ode se generó para usted cuando nombró el proyecto. El delegado del objeto UIApplication suele denominarse ligeramente diferente según el nombre del proyecto.

(No hay duda de que cualquier libro en la impresión estaba usando un Xcode más.)

Seleccionar Files Owner y el inspector de Identidad (comando-alt-2) para confirmar el propietario del archivo es un marcador de posición para el delegado de la aplicación .

+0

Hice este cambio pero el IB no se actualizó. ¿Hay algo que deba hacer para "actualizarlo"? – Ketema

+0

Al seleccionar el marcador de posición "Propietario del archivo", el inspector de identidad muestra su clase en blanco y el diálogo de identidad tiene: etiqueta: propietario del archivo, ID del objeto: -1, bloqueo: heredado - (nada), notas: una casilla de verificación marcada. Traté de cambiar la clase a MOCAppDelegate, pero todavía no obtengo un objeto que represente al delegado en la lista de objetos debajo de los marcadores de posición. – Ketema

3

Debe arrastrar un "NSObject" desde la Biblioteca de objetos al guión gráfico en la barra negra debajo del controlador de vista que desea conectar. Luego, haga clic en NSObject y en el inspector de identidad cambie la clase a AppDelegate. Luego puede crear la conexión a AppDelegate.

Cuestiones relacionadas