item guidelines color bar iphone objective-c ios4 uinavigationbar

iphone - guidelines - Sobrescribir UINavigationBar para establecer un título por defecto



navigation bar swift 4 (2)

¿Por qué no definir una subclase UIViewController que establece la vista del título a través de self.navigationItem.titleView y que sus otros controladores de vista se extiendan desde esa clase? Luego está compartiendo ese comportamiento entre todos sus controladores sin repetir la implementación.

Lo que quiero hacer es una barra de navegación con una imagen. Tengo un controlador de pestañas en mi vista principal, y dentro de cada pestaña tengo un UINavigationController. Desde el interior del UIViewController que llama mi pestaña / navigationController, podría establecer el titleView sin mucho problema, haciendo esto dentro del método viewDidLoad:

self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mylogo.png"]] autorelease];

Pero, quiero reemplazar todos los títulos en mi barra de navegación por esta vista, y parece feo repetir esto en todas partes. Así que hice esto en el delegado (después de vincular todas las cosas de Outlet)

self.tabOneNavController.navigationBar.topItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mylogo.png"]] autorelease];

Nuevamente, funcionó! Vale, casi estoy llegando. Pero el punto es que tengo 5 pestañas y todas ellas tienen controles de navegación dentro. Reduje la repetición del código de cada vista interna a solo 5 veces, pero aún así. Requiere que haga eso para el NavController de cada pestaña.

Luego traté de extender UINavigationBar para crear el mío, donde pude configurar esto en el inicializador y usarlo en el constructor de interfaz como la clase de objeto. Pero parece que no funciona. Aquí esta lo que hice:

@implementation MyNavigationBar - (id)init { self = [super self]; self.tintColor = [UIColor greenColor]; self.topItem.title = @"testing please work"; return self; } @end

en el archivo de interfaz MyNavigationBar hereda de UINavigationBar. Pero esto no funcionó. ¿Debo sobrescribir otro método? ¿cúal? ¿Es esta una buena practica? Ni siquiera estoy seguro de si debería agregar una barra de navegación para cada pestaña, como dije, tengo pestañas y quiero tener una barra de navegación / navegar dentro de ellas. A estas alturas, después de una experiencia cercana a la muerte tratando de descubrir cómo funcionan el compilador / las salidas de la interfaz y las clases, el código está funcionando, solo me gustaría desglosarlo.

¡Gracias!


El problema de repetir el código que describes tiene una solución elegante. Objective-C admite algo llamado "categoría", que le permite agregar métodos a una clase. Un uso común para esto es personalizar las barras de navegación y pestañas. En Xcode 4, harías algo como esto para agregar una categoría en UINavigationBar:

Presione Comando + N o abra el cuadro de diálogo "Nuevo archivo". A continuación, elija "Categoría Objective-C" en el menú Cocoa Touch:

Haga clic en Siguiente y se le pedirá que ingrese el nombre de la clase a la que le gustaría agregar métodos como categoría. Debería verse algo como esto:

Luego, debe terminar con un diálogo de guardar archivo. Una nota rápida sobre la convención aquí. La convención es nombrar una categoría después de la clase original, el signo más y luego una descripción de lo que está agregando. Esto es lo que podría ser tuyo:

Una vez que guarde su archivo, necesitará obtener algo como esto:

Mira esa belleza. Ahora puede anular los métodos de dibujo / inicial predeterminados y extender la funcionalidad de la barra de navegación.

Sugiero que investigue los métodos init y drawRect , aunque no recuerdo cuáles usa la gente. Además, tenga en cuenta que, aunque está bajo NDA, esto puede cambiar en iOS 5, así que prepárese para esa posibilidad.