Verwendung der benutzerdefinierten UINavigationBar

Ich habe Unterklasse vonUINavigationBar.

<code>@interface MyNavigationBar : UINavigationBar
</code>

Einige Änderungen vorgenommen und nun möchte das meine BewerbungNavigationController würde es benutzen:

<code> _navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
 [_window addSubview:[_navigationController view]];
[self.window makeKeyAndVisible];
</code>

Ich will das _navigationController hätteMyNavigationBar

Wie könnte das gemacht werden?

Vielen Dank.

Antworten auf die Frage(2)

<code>@property(nonatomic, readonly) UINavigationBar *navigationBar
</code>

da es schreibgeschützt ist, müssen Sie UINavigationBar in Unterklassen unterteilen und diese Eigenschaft überschreiben oder als schreibgeschützt definieren. :

<code>MyNaviagtionBar *myBar = [[MyNavigationBar alloc] init];
_navigationController.navigationBar = mybar;
</code>

Oder Unterklassen:

MyNavigationController.h

<code>@class MyNavigationBar;

@interface MyNavigationController : UINavigationController
@property(nonatomic, strong) MyNavigationBar *navigationBar;
@end
</code>

MyNavigationController.m

<code>@implementation MyNavigationController
@synthesize navigationBar = _navigationBar;
@end
</code>

Und dann ändern

<code>_navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
</code>

zu

<code>_navigationController = [[MyNavigationController alloc] initWithRootViewController:self.viewController];
</code>
 Pfitz04. Apr. 2012, 10:19
Unterklassen hinzugefügt
 kevlar22. Juli 2012, 12:01
@yanchenko Warum ist das so?
 Streetboy04. Apr. 2012, 10:38
Ich kann das nicht tun, es wird ein Fehler ausgelöst @synthesize navigationBar = _navigationBar; Die Eigenschaft 'navigationBar' versucht, die in der übergeordneten Klasse 'UINavigationController' deklarierte ivar '_navigationBar' zu verwenden.
 Streetboy04. Apr. 2012, 10:11
Ich fügte dies der Benutzeroberfläche hinzu: Aber wenn ich versuche, das zu tun, was Sie gezeigt haben, erhalte ich Folgendes: Zuweisung, dass nur Eigenschaften gelesen werden dürfen
 yanchenko24. Apr. 2012, 09:24
Funktioniert nicht mit iOS5.
Lösung für das Problem

UINavaigationController drin. Sie können dann die auswählennavigationBar im Interface Builder und ändern Sie die Klasse in Ihre Unterklasse vonUINavigationBar.

Um die Instanziierung zu vereinfachen, füge ich eine Kategorie zu `UINavigationController hinzu:

<code>@interface UINavigationController (DSCNavigationController)

+ (UINavigationController *)dsc_navigationControllerWithRootViewController:(UIViewController *)rootViewController;

@end

@implementation UINavigationController (DSCNavigationController)

+ (UINavigationController *)dsc_navigationControllerWithRootViewController:(UIViewController *)rootViewController;
{
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"DSCNavigationController" owner:nil options:nil];

    NSAssert(1 == [topLevelObjects count], @"DSCNavigationController should have one top level object");

    UINavigationController *navigationController = [topLevelObjects objectAtIndex:0];

    NSAssert([navigationController isKindOfClass:[UINavigationController class]], @"Should have a UINavigationController");

    [navigationController pushViewController:rootViewController animated:NO];

    return navigationController;
}

@end
</code>

Oben in der Klasse, die es verwendet, wird sichergestellt, dass die Kategorie importiert wird, in meinem Fall sieht es so aus

<code>#import "UINavigationController+DSCNavigationController"
</code>

Dann sieht es so aus

<code>MyViewController *myViewController = [[MyViewController  alloc] init];
UINavigationController *navigationController = [UINavigationController dsc_navigationControllerWithRootViewController:myViewController];
</code>
 Paul.s04. Apr. 2012, 12:28
Wenn Sie das tunself.window.rootViewController = // ... Sie sollten es auf den navigationController einstellen, nicht auf den rootViewController des navigationControllers
 Streetboy04. Apr. 2012, 12:02
Hmm aber ich rufe von RootViewController und es ist null. Was kann eine Lösung dafür sein?
 Streetboy04. Apr. 2012, 12:46
Vielen Dank. Das was falsch war :)
 Streetboy04. Apr. 2012, 11:44
Hat funktioniert. Aber das funktioniert nicht der [self.navigationController pushViewController: sendMsg animated: YES];
 Streetboy04. Apr. 2012, 11:12
Können Sie mir zeigen, wie es in AppDelegate aussehen soll?
 Streetboy04. Apr. 2012, 11:54
Ja, es ist null. Ich rufe von myViewController aus an
 Paul.s04. Apr. 2012, 11:50
Aus welcher Klasse nennst du das? Prüfe dasNSLog(@"%@", self.navigationController); ist nicht null
 Paul.s04. Apr. 2012, 11:58
Es sollte nicht null sein ... Ihr View-Controller befindet sich nicht in einem navigationController

Ihre Antwort auf die Frage